NetStream:双阈值缓冲,寻求超越缓冲
NetStream: dual threshold buffering, and seeking beyond buffer
This 是一篇关于双阈值缓冲的有用文章。它解释说您可以在 NetStream
上侦听 NetStream.Buffer.Full
和 NetStream.Buffer.Empty
事件并相应地调整 NetStream
的缓冲时间以充分利用可用带宽,并且获得快速的视频开始时间。我遇到了一个问题。当我在我的 NetStream 中寻找经过缓冲的视频部分时,缓冲区再次为空,但我没有收到 NetStream.Buffer.Empty
事件。 NetStream
的缓冲时间仍然设置为我的扩展缓冲时间,所以我失去了快速启动时间的优势。您如何实施此策略以使其在这种情况下正常工作?你怎么知道缓冲区又是空的,或者你已经找到了可用的缓冲区?
编辑:我应该提一下我正在使用缓冲区内搜索(智能搜索)。我认为如果我不这样做的话,这不会成为问题,因为在没有启用此功能的情况下,闪存会在每次搜索时刷新缓冲区。
我的解决方案是在每次搜索时重置缓冲时间。您仍然会收到 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));
});
This 是一篇关于双阈值缓冲的有用文章。它解释说您可以在 NetStream
上侦听 NetStream.Buffer.Full
和 NetStream.Buffer.Empty
事件并相应地调整 NetStream
的缓冲时间以充分利用可用带宽,并且获得快速的视频开始时间。我遇到了一个问题。当我在我的 NetStream 中寻找经过缓冲的视频部分时,缓冲区再次为空,但我没有收到 NetStream.Buffer.Empty
事件。 NetStream
的缓冲时间仍然设置为我的扩展缓冲时间,所以我失去了快速启动时间的优势。您如何实施此策略以使其在这种情况下正常工作?你怎么知道缓冲区又是空的,或者你已经找到了可用的缓冲区?
编辑:我应该提一下我正在使用缓冲区内搜索(智能搜索)。我认为如果我不这样做的话,这不会成为问题,因为在没有启用此功能的情况下,闪存会在每次搜索时刷新缓冲区。
我的解决方案是在每次搜索时重置缓冲时间。您仍然会收到 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));
});