1. 程式人生 > >流播放器音視訊同步的一點思考

流播放器音視訊同步的一點思考

音視訊同步是一個坑,一個繞不過去的坑,一個無可奈何的坑,一個主動跳進去的坑。

時間戳是前提。沒有時間戳或者時間戳錯誤,一切播放端音視訊同步的方法基礎都是不牢靠的。

生成的音視訊流要音視訊同步。可以轉成檔案要本地播放器來驗證一下

rtmp播放器特點:
1,不能堆積資料。如果播放資料堆積,那麼給人的感覺就是延遲太大了。預留的資料不能太少了,不然視訊幀還好說,音訊播放的時候就會出現卡頓的現象。
2,通道數不確定,可能只有視訊,而沒有音訊。


0,當前音訊幀的時間戳m1,視訊幀的時間戳m2
1,音訊未播放資料需要的時間t1,視訊未播放的幀數(或者播放完這些幀需要的時間t2)。
2,沒有音訊只有視訊
3,當音訊存餘的資料量太多時就刪除掉
   當視訊存取的幀數太多時就刪除掉
   特別是當兩者都堆積資料時,要一起刪除掉。這裡是rtmp播放器與一般的視訊檔案播放不一樣的地方。
4,當音視訊兩者的時間戳差太多時,刪除掉時間差的多的。


(這裡閾值我們設定為1.0s,這個最好可以定義,這裡就是定義緩衝區的大小,如果這裡定義的小了,就會出現時斷時續,一直跳幀的情況)
音視訊冗餘的將要播放的資料在1.0s內是正常的。
如果 音視訊幀的冗餘時間都超過了1.0秒,就要對資料進行拋棄處理。
如果 音視訊的不同步超過0.5s(這個值看實際情況,一般視覺上差個0.1s就能感覺出來),就要進行同步操作。


從理論上來說,如果傳輸資料正常,資料是持續產生的,我們持續播放,不會出現需要我們丟棄資料的情況。
實際情況是,網路情況有點抖動,有的時候沒有資料(這種情況我們不管),有的時候,大量資料湧了過來(這個時候我們就要進行資料拋棄了)。


傳送(編碼傳送)部分:
這裡我們要保證輸出的檔案是音視訊同步的。
需要加一個事件校正,因為音訊和視訊編碼之後,時間戳可能有點偏差。