在當中,音頻和視頻通道一般都是分開傳輸,而音視頻分開傳輸帶來另外一個問題就是音視頻必須要同步,如果音視頻不同步,就會導致視頻會議的真實感急劇下降。因此音視頻是否同步也是視頻會議真實感的一個衡量標準。
解決的音視頻同步問題就是使用時間戳,所謂的時間戳就是一個時間的參考計數器,我們先選擇一個參考時鐘,生成數據流時依據參考時鐘上的時間給每個數據塊都打上時間戳;在播放時,讀取數據塊上的時間戳,同時參考當前參考時鐘上的時間來安排播放(如果數據塊的開始時間大于當前參考時鐘上的時間,則不急于播放該數據塊,直到參考時鐘達到數據塊的開始時間;如果數據塊的開始時間小于當前參考時鐘上的時間,則“盡快”播放這塊數據或者索性將這塊數據“丟棄”,以使播放進度追上參考時鐘)。
因此,解決音視頻同步現象有兩個步驟
1. 在生成數據流時要打上正確的。如果數據塊上打的時間戳本身就有問題,那么播放時再怎么調整也于事無補。,視頻流內容是從0s開始的,假設10s時有人開始說話,要求配上音頻流,那么音頻流的起始時間應該是10s,如果時間戳從0s或其它時間開始打,則這個混合的音視頻流在時間同步上本身就出了問題。打時間戳時,視頻流和音頻流都是參考參考時鐘的時間,而數據流之間不會發生參考關系;也就是說,視頻流和音頻流是通過一個中立的第三方(也就是參考時鐘)來實現同步的。
2. 在播放時基于時間戳對數據流進行控制,也就是對數據塊早到或晚到采取不同的處理方法。參考時鐘時間在0-10s內播放視頻流內容過程中,即使收到了音頻流數據塊也不能立即播放它,而必須等到參考時鐘的時間達到10s之后才可以,否則就會引起音視頻不同步問題。
以上就是開發當中解決音視頻同步問題的方法,具體對于采用的編解碼需要用到時間戳代碼實現,我們可以參考ffmpeg里面的音視頻同步的例子。