一、概述
在視頻播放的過程中,既能聽到視頻畫面的聲音也能看到視頻畫面,而且人物、畫面的出現時機和場景都能和對應的口型(聲音)對的上。即視頻畫面和聲音要同步。假如音畫不同步,畫面和聲音就會錯亂。而視頻畫面的渲染和音頻的渲染都是再各自不同的線程中進行的,即畫面渲染用OpenGL ES,音頻的渲染用的是揚聲器或者聽筒。所以要是不加以控制肯定錯亂。
音視頻同步一般分三種:音頻向視頻同步、視頻向音頻同步、音視頻向外部時間鍾同步。
二、原理
音視頻同步一般分為三種:
第一種:音頻向視頻同步
視頻會維持一定的刷新率,或者根據渲染視頻的時長來決定當前視頻幀的渲染時長。當我們播放音頻的時候會與當前渲染的視頻幀的時間戳進行比較,這個差值如果不在閾值(ps:預先定義好的,如果這個差值小於等於閾值就不做處理)范圍內就需要做對齊操作。如果在閾值范圍內就可以不做處理。
對齊原理如下:如果音頻的時間戳比視頻的時間戳大,就需要等待(具體的等待可以是填充空數據、也可以是將音頻的速度放慢播放)。如果音頻的時間戳比視頻的時間戳小,那就需要機型跳幀(具體的跳幀操作可以是加快速度播放的實現,也可以是丟棄一部分音頻幀的實現)。而此時視頻幀是一幀一幀渲染的,一旦視頻的時間戳趕上了音頻的時間戳就可以填充正常的音頻數據了。
優點:音頻可以完全的播放,也就是用戶可以完整的看到視頻畫面
缺點:音頻幀有可能會丟失或者插入靜音幀(也就是00幀)。音頻有可能會加速(或者跳變)也有可能會有靜音數據(或者慢速播放)
第二種:視頻向音頻同步
和第一種情況相反;由於不論是哪個平台上播放音頻的引擎,都可以保證播放音頻的時間長度和與實際這段音頻所代表的時間長度是一致的,所以我們可以依賴於音頻的順序播放為我們提供的時間戳,當客戶端代碼請求發送視頻幀的時候,會先計算當前視頻隊列頭部的視頻幀元素的時間戳與當前音頻播放幀的時間戳的差值。當差值在閾值范圍內就可以渲染這一幀視頻;如果不在閾值范圍內就需要進行對齊操作。
具體的對齊操作方法是:如果當前隊列頭部的視頻幀的時間戳小於當前播放的音頻幀的時間戳,那視頻幀就進行跳幀操作;如果大於當前播放音頻幀的時間戳;那就進行等待(或者重復渲染上一幀或不進行渲染)。
優點:音頻可以連續的進行播放
缺點:視頻畫面會有跳幀操作或者重復渲染操作,但是對於視頻的丟幀或者重復渲染用戶的眼睛不太容易分辨出來。所以這種方式還是不錯的
第三種:音視頻統一向外部時間鍾同步。
這種策略是以上兩種策略的綜合體,其實就是外部單獨維護一軌外部時鍾,我們要保證這個外部時鍾的更新是按照時間的增加慢慢增加的,當獲取音頻數據和視頻幀的時候,都需要和這個外部時鍾進行對齊,如果沒有超過閾值就直接返回音頻或者視頻幀,如果超過了閾值就要進行對齊操作。
具體的對齊方法是:使用上述兩種方式的對齊分別應用於音頻的對齊和視頻的對齊。
優點:可以最大限度的保證音頻和視頻都不發生跳幀行為
缺點:如果控制不好外部時鍾,音頻和視頻都有可能發生跳幀行為(視頻畫面&聲音錯亂)
三、總結
根據人耳朵和眼睛生理構造因素,得出一個結論,那就是人的耳朵要比眼睛敏感的多,也就是說如果音頻有跳幀行為則人的耳朵很容易分辨出來,如果視頻畫面有跳幀行為或者重復渲染人的眼睛則不容易分辨出來。根據這理論在做視頻播放器的時候可以選擇的音視頻對齊策略是“視頻向音頻對齊”。