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