2

我今天的问题涉及 Flash AS3 视频缓冲。(流式或渐进式)我希望能够检测到视频何时被缓冲,因此我可以显示某种动画让用户知道再等一会儿。

替代文字

目前我的视频将启动,在第 1 帧上保持 3-4 秒然后播放。有点让人觉得视频已暂停或损坏:(

更新

感谢iandisme,我相信我现在正朝着正确的方向前进。来自 livedocs 的 NetStatusEvent。在我看来,要工作的关键状态是,"NetStream.Buffer.Empty"所以我在其中添加了一些代码,看看这是否会触发我的动画或跟踪语句。还没有运气,但是当缓冲区已满时,它会触发我的代码:/也许我的视频总是介于两者之间Buffer.EmptyBuffer.Full这就是为什么当我测试用例时它不会触发任何代码Buffer.Empty

当前代码

public function netStatusHandler(event:NetStatusEvent):void 
  {
     // handles net status events
     switch (event.info.code) 

        {
            case "NetStream.Buffer.Empty":
                  trace("☼☼☼ Buffering!"); //<- never traces
                  addChild(bufferLoop);    //<- doesn't execute
            break;

            case "NetStream.Buffer.Full":
                  trace("☼☼☼ FULL!");      //<- trace works here
                  removeChild(bufferLoop); //<- so does any other code
            break;

            case "NetStream.Buffer.Flush":
                  trace("☼☼☼ FLUSH!");
                  //Not sure if this is important
            break
        }
    }
4

3 回答 3

2

您使用的是自定义滚动播放器吗?我知道 FLVPlayback 类有一个内置的缓冲事件。

如果您没有使用 FLVPlayback,则 NetStream 对象会在每次启动或停止缓冲时触发一个包含info 对象的 netStatusEvent。您应该能够捕获该事件并使用它播放/隐藏您的动画。

于 2009-12-07T22:30:23.640 回答
1

您可以尝试每 100 毫秒检查一次 NetStream 的 bufferTime 和 bufferLength 并据此做出决定。NetStream 的 bufferTime 告诉它应该在播放之前缓冲多长时间,而 bufferLength 告诉它已经在缓冲区中多长时间。

function onTimerEvent(e:TimerEvent):void {
  var percent:Number = Math.round(ns.bufferLength/ns.bufferTime100 * 100);
  if (percent >= 95 && contains(bufferLoop)) {
    removeChild(bufferLoop);
  }
  if (percent < 25 && !contains(bufferLoop)) {
    addChild(bufferLoop);
  }
}

于 2009-12-08T05:50:13.950 回答
0

我遇到了这个,并认为我会分享。上面的 Leon 提到“NetStream.Buffer.Empty”不跟踪任何东西。那是因为您正在从本地计算机加载 FLV,因此缓冲区永远不会为空。它在您实际在线流式传输时有效。

我所做的只是将我想要的剪辑设置为电影开始播放时可见的“等待缓冲区”,然后使用此代码使其消失并返回。像魅力一样工作。

var vidplaying:Boolean = false;

playmovie_btn.addEventListener(MouseEvent.CLICK, playmovie);

function playmovie(event:MouseEvent):void{

    vidplaying = true;
    wait_mc.visible = true;
        (yoru flv and netstream stuff) ect
}

ns.addEventListener(NetStatusEvent.NET_STATUS, netStatus); 

    function netStatus(e:NetStatusEvent) {

        if(vidplaying == true && e.info.code == "NetStream.Buffer.Empty"){
            wait_mc.visible = true;
        }
        if(e.info.code == "NetStream.Buffer.Full"){
            wait_mc.visible = false;
        }
}// netStatus
于 2010-05-26T02:15:11.707 回答