mea*_*ode 4 flash video streaming actionscript-3
使用NetStream从http流式传输内容,我注意到某些导出的h264的esp,如果玩家遇到空缓冲区,它将停止并缓冲到所请求的长度(如预期的那样).
然而,一旦缓冲区已满,播放就不会恢复,而是向前跳跃,因此 - 在短时间内立即播放缓冲的持续时间,从而再次触发空缓冲区......然后这将一遍又一遍地继续.
据推测,当网络流暂停缓冲时,播放头位置继续,并且播放器在恢复时尝试捕捉到该位置 - 但是考虑到可能需要5秒钟来构建2秒缓冲区 - 它最终会再次使用无用的缓冲区.
(这是假设)
我试图通过侦听空缓冲区netstatus事件,暂停流,同时设置一个循环来检查当前缓冲区长度与请求的缓冲区长度来解决这个问题.一旦缓冲区长度为大于或等于请求的缓冲区..但是当没有足够的视频剩余时,这会导致问题...例如,10秒缓冲区只剩下5秒,循环只是坐在那里等待缓冲区长度只剩下5个人的10秒......
您可能会认为您可以简单地检查哪个更小,剩余时间或请求的缓冲区长度..但闪存提供的时间不准确..
如果添加净流当前时间索引加上缓冲时间,则总数不是影片的整个持续时间(在结束时).它接近但不相同.
这让我回到原来的问题,如果还有另一种方法可以解决这个问题,那么显然flash会知道缓冲区什么时候准备就绪,那么如何在缓冲时获得闪存暂停,并在缓冲区准备就绪后恢复?目前它没有..它暂停,然后一旦缓冲区已满 - 它在大约.1秒内播放整个缓冲内容.
斯蒂芬,提前谢谢.
好吧,大量的搜索(哇,描述这个问题有多难)..我想另外这个问题与较低的带宽有关,很多人可能不会测试这种情况..
所以无论如何,很多人遇到这个问题 - 似乎依赖于编解码器设置 - 可能是关键帧或流媒体提示如何工作..我不知道.
我所知道的是这不应该是玩家关注的问题,闪光灯再次成为一个巨大的失望..
但是,我确实设法解决了这个问题,如果你听netstatus事件,并等待一个空的缓冲区事件,你就暂停流..理想情况下,你现在听一个缓冲区完整事件,并恢复它 - 但由于流已暂停 - 缓冲区无法构建(当然,视频仍在加载中).
如果你现在设置一个计时器(我在输入框架上设置一个事件),并听取两个条件之一成为真:
条件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();
            }
        });
    }
}
干杯.