[英]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.