[SimplePlayer] 8. 音視頻同步
音頻與視頻在播放當中可能會由於種種原因(如:音視頻並非在同一時間開始播放,或視頻由於解碼任務繁重導致輸出圖像延遲等)導致音頻與視頻的播放時間出現偏差,這種就是音視頻的同步問題,本文會對音視頻同步進行討論。
有三種音視頻同步方式:
- 視頻同步到音頻時鐘(synchronize video to audio clock)
- 音頻同步到視頻時鐘(synchronize audio to video clock)
- 音視頻同步到外部時鐘(synchronize audio and video to external clock)
常見的實現方式是把視頻同步到音頻時鐘。主要原因是,對於延遲以及卡頓,人的聽覺較視覺更為敏感,需要盡量保持音頻順暢輸出。
時鐘
我們前面提到視頻時鐘、音頻時鐘指的是連續的時間。視頻文件內存儲的視頻以及音頻的時間戳都是離散的,不過如果我們假設視頻與音頻分別都有一個獨立的時鐘,各幀的時間戳代表的就是時鐘上的某一時刻。如果在某一時刻,此時音頻時鐘與視頻時鐘上的刻度相同,則表明此時的音視頻是完全同步的。
為了得到音頻或者視頻的時鐘,我們可以在音頻或者視頻輸出時記錄輸出幀的$pts$以及此時的系統時間$CLK_{put}$,然後在進行時鐘比較時取出上次輸出時的$pts$以及$CLK_{put}$,並獲取當前的系統時間$CLK_{get}$,最後執行以下運算就能得到音頻或者視頻時鐘。
$CLK = pts + CLK_{get} – CLK_{put}$
延遲
實際上音視頻之間總會存在延遲,如果在某一時刻,視頻時鐘的刻度大於音頻時鐘的刻度,則表明視頻比音頻播放早了,或者說音頻延遲了。
反之,如果在某一時刻,音頻時鐘的刻度大於視頻時鐘的刻度,則表明音頻比視頻播放早了,或者說視頻延遲了。
可接受的延遲範圍
人對延遲的敏感度並不會很高,對於通常的視頻幀率來說(24fps或者30fps,即延遲在40ms之內),一幀的延遲是人類不容易察覺,即可接受的延遲範圍。因此,如果音頻以及視頻的時鐘差值在此範圍內,則不用特地進行調整。
延遲調整
如果音頻時鐘與視頻時鐘之間的延遲超出可接受的範圍,則需要進行時鐘的調整,時鐘調整主要是通過改變某一幀的播放時間來實現的,實現的方法也有多種。如果視頻延遲了,則可以加快視頻幀的播放速度:一解碼完成,判斷視頻延遲,立即開始輸出圖像;或者直接跳過那些pts不在可接受範圍內的幀。如果音頻延遲了,則可以延遲視頻的播放速度,或者先暫停輸出後面的視頻幀直到音頻追上。
[SimplePlayer] 8. 音視頻同步