我目前正在开发具有分辨率切换功能的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;
}
}
}
答案 0 :(得分:1)
正如文档中所述:“offset的默认值为-1,它将切换行为默认为标准。在此模式下,服务器确定流之间的良好转换点及时从接收到切换呼叫的那一点开始,并在那一点切换。“
因此,您必须将'offset'参数更改为高于当前播放时间的值(Netstream.time)。如果值较小,则发送NetStream.Play.Failed状态事件。
答案 1 :(得分:1)
可能是服务器正在尝试找到当前偏移的最近的i帧,这需要时间。如果你知道FPS是什么,两个i帧之间的时间是你可以尝试寻找非常接近下一个或前一个i帧的时间,这将加快搜索和服务。
有关i-frame的更多信息:http://en.wikipedia.org/wiki/Video_compression_picture_types