NetStream:双阈值缓冲,并寻求超越缓冲区

时间:2015-01-11 19:06:51

标签: actionscript-3 flash buffering netstream

This是关于双阈值缓冲的有用文章。它解释了您可以在NetStream.Buffer.Full上收听NetStream.Buffer.EmptyNetStream个事件,并相应地调整NetStream的缓冲时间,以充分利用可用的带宽并获得快速的视频开始时间。我遇到了一个问题。当我在NetStream中寻找过去缓冲的视频部分时,缓冲区再次变空,但我没有得到NetStream.Buffer.Empty事件。 NetStream的缓冲时间仍然设置为我的扩展缓冲时间,因此我失去了快速启动时间的优势。如何在这种情况下实施此策略以使其正常工作?你怎么知道缓冲区再次为空或者你已经找到了可用的缓冲区?

编辑:我应该提到我正在使用缓冲区搜索(Smart Seeking)。如果我不这样做,我认为这不会成为一个问题,因为在没有启用此功能的情况下,闪存会在每次搜索时刷新缓冲区。

1 个答案:

答案 0 :(得分:0)

我的解决方案是在每次搜索时重置缓冲时间。您仍然会收到NetStream.Buffer.Full事件,并且如果您碰巧寻找缓冲区已经大于最小缓冲区的位置,它会立即触发,因此NetStream.Buffer.Full的处理程序将立即将缓冲时间设置回扩展缓冲时间。这是一个例子:

var videoStream:NetStream = new NetStream(nc);

videoStream.addEventListener(NetStatusEvent.NET_STATUS, function (event:NetStatusEvent):void {
    switch(event.info.code) {
        case "NetStream.Buffer.Full":
            // this will keep the buffer filling continuously while there is bandwidth
            videoStream.bufferTime = Settings.maxBuffer;
            State.buffering = false;
            break;
        case "NetStream.Buffer.Empty":
            // if we run out of buffer we'll reset the buffer time to the min
            videoStream.bufferTime = Settings.minBuffer;
            State.buffering = true;
            break;
    }
}

_view.addEventListener(SeekEvent.SEEK, function (event:SeekEvent):void {
    State.buffering = true;
    videoStream.bufferTime = Settings.minBuffer;
    videoStream.seek(event.seek * (_duration || 0));
});