使用 NetStream 从 http 流式传输内容,我注意到带有某些导出的 h264 的 esp,如果播放器遇到空缓冲区,它将停止并缓冲到请求的长度(如预期的那样)。
然而,一旦缓冲区满了,播放就不会恢复,而是向前跳,这样一来,立即播放缓冲的持续时间,从而再次触发一个空缓冲区。这将继续下去,结束了。
大概当网络流暂停缓冲时,播放头位置继续,并且播放器试图在恢复时捕捉到该位置 - 但是考虑到构建 2 秒缓冲区可能需要 5 秒 - 它最终得到一个无用的缓冲区再次..
(这是一个假设)
我试图通过监听空缓冲区网络状态事件、暂停流并同时设置一个循环来检查当前缓冲区长度与请求的缓冲区长度来解决这个问题……并在缓冲区长度大于或等于请求的缓冲区。但是,当没有足够的视频剩余时,这会导致问题。例如,一个 10 秒的缓冲区只剩下 5 秒,循环只是坐在那里等待当只剩下 5 秒时,缓冲长度为 10 秒......
你会认为你可以简单地检查哪个更小,剩余时间或请求的缓冲区长度..但是闪存给出的时间并不准确..
如果您添加网络流当前时间索引,加上缓冲时间,则总时长不是电影的整个持续时间(当结束时)..它很接近但不相同。
这让我回到了最初的问题,如果有另一种方法可以解决这个问题,显然闪存知道缓冲区何时准备就绪,那么我如何才能让闪存在缓冲时暂停,并在缓冲区准备好后恢复?目前它没有..它会暂停,然后一旦缓冲区已满 - 它会在大约 0.1 秒内播放整个缓冲内容。
提前致谢, 斯蒂芬。
最佳答案
好吧,到处搜索(哇,描述这个问题有多难)。我想另外这个问题与较低的带宽有关,很多人可能不会测试这个场景。
所以无论如何,很多人都遇到过这个问题 - 似乎取决于编解码器设置 - 可能是关键帧或流式传输提示的工作方式......我不知道。
我所知道的是这不应该成为玩家关心的问题,Flash 再次成为一个巨大的失望......
但是,我确实设法解决了这个问题,如果你监听 netstatus 事件,并等待一个空缓冲区事件,你暂停流..理想情况下,现在你监听一个缓冲区满事件,并且恢复它 - 但由于流已暂停 - 缓冲区不会构建(但当然,视频仍在加载中)。
如果您现在设置一个计时器(我在进入帧时设置了一个事件),并监听两个条件之一是否为真:
- a) bufferLength 大于 或等于缓冲时间(实际 缓冲区至少是请求的缓冲区 尺寸)
- b) 加载的字节数 等于总字节数
条件A是不够的,因为在视频结束时,bufferLength可能因为剩余时间较少而无法满足请求的缓冲区大小,此时检查当前播放头位置+实际缓冲区长度可以不等于电影的持续时间,所以这就是为什么需要条件 B,您检查实际电影是否已完全加载,并且可以播放。
如果对任何人有用的话,这是我的代码:
function onNetStatus(e:NetStatusEvent):void
if (e.info.code == "NetStream.Buffer.Empty") {
ns.pause();
playerRoot.addEventListener(Event.ENTER_FRAME, function() {
if (ns.bufferLength >= ns.bufferTime || ns.bytesLoaded == ns.bytesTotal) {
playerRoot.removeEventListener(Event.ENTER_FRAME, arguments.callee);
ns.resume();
}
});
}
}
干杯。
关于flash - ActionScript : NetStream stutters after buffering,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1079935/