【问题标题】:How to detect when video is buffering?如何检测视频何时缓冲?
【发布时间】:2010-12-24 05:08:04
【问题描述】:

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

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

更新

感谢iandisme 我相信我现在正朝着正确的方向前进。 NetStatusEvent from livedocs。在我看来,要工作的关键状态是"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
        }
    }

【问题讨论】:

    标签: flash actionscript-3 video streaming buffering


    【解决方案1】:

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

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

    【讨论】:

    • 非常感谢您为我指明了正确的方向 :) 我现在正在尝试使用“NetStream.Buffer.Empty”,但我从来没有从中得到任何痕迹:(
    • 两个链接都坏了。
    【解决方案2】:

    您可以尝试每 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);
      }
    }

    【讨论】:

    • 您的意思是 (ns.bufferLength/ns.bufferTime * 100) 吗?我仍然没有得到测试痕迹来追踪这个,但仍在尝试谢谢!
    【解决方案3】:

    我遇到了这个,并认为我会分享。上面的 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多