2009-07-03 26 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