[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不在可接受範圍內的幀。如果音訊延遲了,則可以延遲視訊的播放速度,或者先暫停輸出後面的視訊幀直到音訊追上。