代码之家  ›  专栏  ›  技术社区  ›  meandmycode

Actionscript:NetStream缓冲后出现口吃

  •  4
  • meandmycode  · 技术社区  · 17 年前

    但是,一旦缓冲区满了,播放就不会继续,而是向前跳,就像这样-在短时间内立即播放缓冲的持续时间,从而再次触发空缓冲区。。这将一次又一次地继续下去。

    大概当netstream暂停缓冲时,playhead位置继续,玩家试图在恢复时捕捉到该位置-但是考虑到构建2秒缓冲可能需要5秒-它再次以无用缓冲结束。。

    (这是一个假设)

    我试图通过侦听空缓冲区netstatus事件、暂停流,同时设置一个循环来检查当前缓冲区长度与请求的缓冲区长度,从而解决此问题。。一旦缓冲区长度大于或等于请求的缓冲区,则恢复。。但是,如果剩余的视频不足,则会导致问题。。例如,一个10秒的缓冲区只剩下5秒,循环就在那里等待10秒的缓冲区长度,而剩下的只有5秒。。。

    您可能认为您可以简单地检查哪一个更小,剩下的时间还是请求的缓冲区长度。。然而,flash给出的时间并不准确。。

    如果添加净流当前时间索引,加上缓冲时间,则总时间不是电影的整个持续时间(结束时)。。这很接近,但不一样。

    这让我回到了最初的问题,如果有其他方法来解决这个问题,flash显然知道缓冲区何时准备就绪,那么我如何在缓冲区准备就绪时获得flash暂停,并在缓冲区准备就绪后恢复?目前没有。。它暂停,然后一旦缓冲区满了,它将在大约0.1秒的时间内播放整个缓冲内容。

    提前感谢,, 斯蒂芬。

    2 回复  |  直到 17 年前
        1
  •  5
  •   meandmycode    17 年前

    好吧,到处搜索(哇,描述这个问题有多难)。。我想,另外,这个问题与较低的带宽有关,很多人可能不会测试这个场景。。

    因此,不管怎样,很多人都遇到了这个问题——似乎取决于编解码器设置——可能是关键帧设置或流媒体提示的工作方式。。我不知道。

    我所知道的是,这不应该是一个担心的球员,闪光再次成为一个巨大的失望。。

    但是,我确实设法解决了这个问题,如果您侦听netstatus事件,并等待一个空缓冲区事件,您将暂停流。。理想情况下,现在您可以侦听缓冲区已满事件,然后恢复它-但由于流已暂停-缓冲区不会生成(当然,视频仍在加载中)。

    如果您现在设置计时器(我在enter frame上设置了一个事件),并侦听两个条件之一是否变为真:

    • a) 缓冲区长度大于 缓冲区至少是请求的缓冲区 尺寸)
    • 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();
                }
            });
        }
    }
    

        2
  •  0
  •   David    17 年前

    你可以尝试的一件事是用JW播放器播放视频,看看是否会发生同样的问题( http://www.longtailvideo.com/players/jw-flv-player/ )这是一款内置于AS3的开源视频播放器。