2009-07-03 60 views
4

使用的NetStream以流从HTTP内容后NetStream的口吃,我注意到,尤指某些出口H264的,如果玩家遇到一个空的缓冲区,将停止和缓冲所请求的长度(如预期)。的ActionScript:缓冲

但是,一旦缓冲区已满,播放不会恢复,而是向前跳转,因此 - 在短时间内立即播放缓冲持续时间,从而再次触发空缓冲区。然后这将继续并结束。

推测当netstream暂停缓冲时,播放头位置会继续,并且播放器正试图在简历上捕捉到该位置 - 但是,如果需要5秒钟才能构建2秒缓冲区,则最终会出现无用再次缓冲..

(这是一个假设)

我试图通过监听空缓冲区netStatus事件,暂停流解决这一问题,并在同一时间建立一个循环检查当前的缓冲区长度与请求的缓冲区长度..并且一旦缓冲区长度大于或等于请求的缓冲区就重新开始..然而,当没有足够的时间时,这会导致问题E视频剩下的。例如,10秒的缓冲只有5秒时,循环只是坐在那里等待10秒的时候,那里有只5左侧缓冲区长度...

你会认为,你可以简单地检查这是更小的,或离开时所要求的缓冲区长度。但是时代闪光灯给出不准确..

如果添加了净流当前时间指数,加上缓冲时间,总不是整个电影的持续时间(最后)..它是接近但不相同。

这使我回到原来的问题,如果有另一种方法来解决这个问题,显然闪存知​​道什么时候缓冲区准备好了,所以如何让它在缓冲区时暂停,并且一旦缓冲区准备好就恢复?目前它不会......暂停,然后一旦缓冲区满了,它会以大约0.1秒的速度播放整个缓冲内容。

在此先感谢, 斯蒂芬。

回答

4

好了好了,大量的摸索(哇,是如何很难形容这个问题)的..我想另外的问题是关系到较低的带宽,很多人可能不测试此业务情景..

所以无论如何,很多人经历反应这个问题似乎依赖于编解码器设置 - 也许关键帧或流提示如何工作..我不知道。

我所知道的是这不应该是玩家关注,闪光灯再次变成一个巨大的失望..

,但我还是设法使黑客来解决这个问题,如果你听netstatus事件,并等待一个空的缓冲区事件,你暂停流...理想情况下,你现在听一个缓冲区满的事件,并恢复它 - 但由于流暂停 - 缓冲区不会建立(但当然,视频仍在加载中)。

如果现在设置一个计时器(我设置输入框的事件),并听取了两个条件之一,成为真正:

  • 一)BufferLength中大于 或等于将bufferTime (实际 缓冲器至少请求缓冲器 大小)
  • b)中所加载的字节计数 等于总字节数

条件A是不够的BEC如果在视频结束时使用,bufferLength可能无法适应请求的缓冲区大小,因为剩余时间较少,并且此时检查当前播放头位置+实际缓冲区长度不等于电影的持续时间,所以这就是为什么需要条件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(); 
      } 
     }); 
    } 
} 

干杯。

0

我从来没有遇到过您所描述的问题。它是否发生在每个视频上?

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

+0

嗨大卫,不,它不会发生在每个视频 - 所以大概是它的编码问题..这是一场噩梦。它被编码为来自camtasia的h264,每秒都有关键帧。我想我会尝试一些不同的导出来尝试解决问题 - 如果我找到它,我会回发。谢谢 – meandmycode 2009-07-04 14:01:35