簡體   English   中英

如何在ActionScript中以NetStream的“傳入幀速度”(不是視頻內部)播放FLV視頻

[英]How to play FLV video at “incoming frames speed” (not video-internal) coming from NetStream in ActionScript

如何在沒有任何額外AS幀速率邏輯的情況下立即播放NetStream幀?

我已經從Red5收到的RTMP協議中錄制了一些音頻和視頻數據包,現在我試圖通過遞增時間戳將數據包推送到NetStream ,將其發送回閃存客戶端。 循環序列的長度約為~20秒,nad是從大約200個RTMP數據包構建的(VideoData / AudioData)

環境:本地主機上的Flash客戶端和服務器,沒有網絡瓶頸,視頻是由同一個Flash客戶端提前H.264編碼的。

它通常有效,但視頻不是很流暢 - 有很多凍結,減速和長時間停頓。 較慢的數據包傳輸導致更多的暫停和凍結。 甚至是極端長時間的暫停,例如在沒有效果的情況下傳輸整個序列2x-3x次(~60秒) - 這在每秒轉發慢於~2個RTPM數據包時出現。

問題看起來像一些AS邏輯試圖強制視頻的幀速率,而不僅僅是輸出接收到的幀 ,所以我的一個問題是AS是否在直播中尋找視頻幀內fps信息? 為什么它可以發揮更快,但不能發揮更慢? 如何“逐幀”播放視頻而不是將視頻fps與RTPM數據包時間戳同步?

另一方面,如果我比錄音機更快地推送數據包,視頻只是更快但幾乎流暢 - 我只是不能得到更慢或穩定的流(仍然是非常不規則的速度)。

我已經分析了一些NetStream值:

  • .bufferLength = ~0或0.001,當我以非常快的方式轉發數據包時(例如定位~90fps)
  • .currentFPS =顯示在Video對象中看到的實際FPS計數,而不是傳入的幀/ s
  • .info.currentBytesPerSecond = ~8 kB / s到~50kB / s,具體取決於轉發速度
  • .info.droppedFrames = 經常插入,即使我像2 /秒一樣流式傳輸數據包! 長時間自啟動 - 暫停后也會跳轉(但緩沖區是整個時間0!)
  • .info.isLive = true
  • .info.dataBufferLength =與.bufferLength相同

看起來AS正在丟幀,因為接收的RTMP數據包太少 - 比如期望它們將以內部幀編碼的fps速度到達。

我目前最好的NetStream配置:

chatStream.videoReliable = false;
chatStream.audioReliable = false;
chatStream.backBufferTime = 0;
chatStream.bufferTime =0;

請注意,如果我將bufferTime設置為1 ,視頻將暫停,直到收集“1秒視頻”但這不是真的 - 緩沖非常慢,就像假設視頻的FPS為100或200 - 即使我快速轉發數據包(比如在沒有緩沖區的情況下定位~15fps),緩沖區填充大約10-20秒。

當然,循環以關鍵幀視頻數據開始,序列的關鍵幀間隔約為15幀。

你試過netStream.step(1)嗎

http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/net/NetStream.html#step()

我也會從play()調用中刪除'live'。

最后,也許閃存嘗試像在常規時間線中那樣同步到音頻。 您是否嘗試過沒有音頻頻道的視頻?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM