如何使用play2()函数来实现视频的快速流切换?

50

我目前正在开发一个具有分辨率切换功能的Flash webplayer。我试图在Actionscript中利用NetStream类的play2()函数。

我遇到的问题是视频切换不够快速。对于熟悉play2()函数的人来说,我认为播放器执行的是"标准切换"而不是"快速切换"

文档中提到,当偏移参数为-1时,会进行快速切换。但实际上,一旦接收到"NetStream.Play.Transition"事件,播放器会等待直到达到ns.time + ns.bufferLength所表示的时间后才执行切换。

我以为快速切换会清除缓存,但是通过检查ns.backbufferlength,我发现所有内容仍然被缓存。此外,文档还提到:"当偏移量为-1时,在netstream.time + 3之后的第一个可用关键帧处进行切换",这就让我感到困惑了。

如果有任何关于此事的帮助/见解,将不胜感激。

这是一段描述正在发生的事情的代码片段(当用户点击以新分辨率更改时,类似于YouTube,将调用newStream()):
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;
        }
    }
}

4
你是否考虑过使用一个可以为你实现动态流切换的框架?我使用这种框架是因为它让我能够专注于其他事情(少了一件要担心的事情)。目前 OSMF 可以做很多事情,但对于 HTTP 流的 DSS 还不行。然而,OVP(Akamai HDCore)甚至可以为 http 流到 Flash 实现 DSS。祝好运! - Jacksonkr
1
在谷歌上搜索答案时,我找到了几个相关的内容,但我正在开发一个非常具体的播放器(其中有一些额外的功能)。此外,由于我已经完成了大部分的播放器(除了“平滑”的转换),我希望能够找到解决方案。目前,当出现流切换时,我只添加了一个小的“加载”图标来应对,尽管我留下了这个功能,以防我将来会找到解决这个问题的方法。 - funseiki
可以使用这个来切换到不同的视频流,而不是切换相同内容的视频吗? - Aditya P
你尝试过 Adobe 的这些“最佳实践”吗?http://help.adobe.com/en_US/flashmediaserver/devguide/WS3f305989b15d10dc44125e8c12a5fb2d1da-8000.html - Raohmaru
4
请注意你要播放和切换的视频流。它们需要仔细编码,特别是所有视频/流的关键帧值应该设置为相同的值。设置此属性取决于你是播放实时媒体还是点播媒体,或者你正在使用的编码软件。 - Max Golovanchuk
显示剩余2条评论
2个回答

1
根据文档所述:“offset的默认值为-1,这将切换行为设置为标准模式。在此模式下,服务器确定从接收切换调用时向前的流的好转换点,并在该点切换。”
因此,您需要将“offset”参数更改为高于当前播放时间(NetStream.time)的值。如果该值较小,则会发送NetStream.Play.Failed状态事件。

文档中哪一部分说明offset = -1是标准切换模式?我正在寻找这样的内容:“offset的默认值是-1,即快速切换模式。”您可以在此处找到引用:“(http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/net/NetStreamPlayOptions.html#offset)”,第二段,“Fast Switch”下的第一句话。 - funseiki
此外,根据文档,不需要将“offset”设置为大于当前播放时间的值,因为默认情况下,“当偏移量为-1时,在netstream.time + 3后的第一个可用关键帧处发生切换”。 - funseiki
@funseiki - 这有点奇怪,因为我使用的是离线文档(用于flash cs5),它写道“offset的默认值为-1,将切换行为设置为标准。”而我检查了在线文档,发现它写道“offset的默认值为-1,这是快速切换模式。”看一下:https://www.dropbox.com/s/2qm143e6mc93byl/offline.png - user1922137
奇怪 - 你测试过这个代码是否有效吗?我记得曾经试图显式设置偏移参数,但它并没有按预期工作(当播放头到达预期时间时,缓冲区并没有清除)。 - funseiki

1
可能是服务器正在尝试找到最接近当前偏移量的i帧,这需要时间。 如果您知道FPS是什么以及两个i帧之间的时间,您可以尝试将其定位到非常靠近下一个或上一个i帧的时间,这将加快搜索和提供服务的速度。
有关i帧的更多信息:http://en.wikipedia.org/wiki/Video_compression_picture_types

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接