如何利用 play2() 函数进行视频的快速流切换?

Posted

技术标签:

【中文标题】如何利用 play2() 函数进行视频的快速流切换?【英文标题】:How to make use of play2() function in order to perform fast stream switching of videos? 【发布时间】:2011-10-14 11:11:17 【问题描述】:

我目前正在开发具有分辨率切换功能的 Flash 网络播放器。我正在尝试在 Actionscript 中使用 NetStream 类的 play2() 函数。

我遇到的问题是视频不会很快改变。对于熟悉play2() 功能的人,我相信玩家正在执行"standard switch" 而不是"fast switch."

The documentation says that当offset参数为-1时,发生快速切换。实际发生的情况是,一旦收到"NetStream.Play.Transition" 事件,玩家将等待直到达到ns.time + ns.bufferLength 表示的时间,然后再执行切换。

我以为快速切换会清除缓冲区,但在检查ns.backbufferlength 时,我发现所有内容都仍在缓存中。它还提到:“当偏移量为-1时,切换发生在netstream.time + 3之后的第一个可用关键帧处”,这就是我感到困惑的原因。

非常感谢您对此事的任何帮助/见解。

这是一段描述正在发生的事情的代码(newStream() 在用户单击以更改为新分辨率时调用,youtube 风格):

public function newStream(address:String):void

    var opts:NetStreamPlayOptions = new NetStreamPlayOptions();
    opts.streamName = address;
    opts.transition = NetStreamPlayTransitions.SWITCH;
    opts.offset = -1;
    ns.play2(opts);


private function nsCallback(event:NetStatusEvent)

    switch(event.info.code)
    
        case "NetStream.Play.Transition":
        
            trace("Current time (on Transition): " + 
                  ns.time, "Buffer: " + ns.bufferLength);
            var estTime:Number = ns.time + ns.bufferLength;
            trace("Estimated Completion Time: " + estTime);
            break;
        
    

【问题讨论】:

您是否研究过为您执行动态流切换框架?我使用一个是因为它可以让我专注于其他事情(我不必担心的事情更少)。 OSMF 会做很多事情,但对 http 流还没有 DSS。但是,OVP (Akamai HDCore) 甚至会为 http 流闪存执行 DSS。祝你好运! 我在谷歌搜索时发现了一些问题的答案,但我正在构建一个非常具体的播放器(我添加了一些额外的功能)。此外,由于我已经完成了大部分播放器(减去“平滑”过渡),我希望有一个解决方案。到目前为止,只要有流切换,我就可以在任何时候添加一个小的“加载”图标,尽管我已经保留了可用的功能,以防我找到这个问题的答案。 不是切换相同内容的视频,这可以用来切换到不同的视频流吗? 您是否尝试过 Adob​​e 的这些“最佳实践”? help.adobe.com/en_US/flashmediaserver/devguide/… 注意您尝试播放和切换的视频流。它们需要仔细编码,尤其是所有视频/流的关键帧值应设置为相同的值。设置此属性取决于您播放的是直播媒体还是 VOD 媒体,或者您使用的编码软件。 【参考方案1】:

这可能是因为服务器正试图找到离当前偏移最近的 i-frame,这需要时间。如果您知道什么是 FPS 以及两个 i-frame 之间的时间,您可以尝试寻找非常接近下一个或上一个 i-frame 的时间,这将加快搜索和服务速度。

关于 i-frame 的更多信息:http://en.wikipedia.org/wiki/Video_compression_picture_types

【讨论】:

【参考方案2】:

正如文档所说:“offset 的默认值为 -1,默认切换行为为标准。在这种模式下,服务器会及时确定流之间的良好过渡点从它接收到 switch 调用的那一点开始,并在该点进行切换。"

因此您必须将 'offset' 参数更改为高于当前播放时间的值 (Netstream.time)。如果值小于,则发送 NetStream.Play.Failed 状态事件。

【讨论】:

文档的哪一部分说 offset = -1 是标准切换模式?我在看的内容是这样的:“偏移量的默认值为-1,这是快速切换模式。”你可以找到这个报价here。第二段,“快速切换”下的第一句 另外,根据文档,不需要将'offset'设置为大于当前播放时间的值,因为默认情况下,“当offset为-1时,切换发生在netstream.time + 3" 之后的第一个可用关键帧 @funseiki - 这有点奇怪,因为我使用离线文档(用于 flash cs5)并且它写了“偏移量的默认值为 -1,默认切换行为为标准。”而我查看了在线文档,发现上面写着“offset的默认值为-1,即快速切换模式”。看看:dropbox.com/s/2qm143e6mc93byl/offline.png 奇怪 - 你测试过它是否有效吗?我记得尝试显式设置偏移参数但它没有按预期工作(当播放头到达预期时间时缓冲区没有清除)

以上是关于如何利用 play2() 函数进行视频的快速流切换?的主要内容,如果未能解决你的问题,请参考以下文章

视频处理系列︱利用达摩院ModelScope进行视频人物分割+背景切换

阿里云 RTC QoS 及视频编码联合优化之切流编码

利用windows批处理bat文件快速执行视频转码

iOS 利用FFmpeg 开发音视频流

如何在qqis中快速利用自定义坐标定位,进行准确测量

MAC/iOS利用FFmpeg解析音视频数据流