值,則降低該視頻數(shù)據(jù)的播放速率,以使該音頻數(shù)據(jù)和視頻數(shù)據(jù)播放同步;若調(diào)節(jié)速率為負(fù)值,則增加該視頻數(shù)據(jù)的播放速率,以使該音頻數(shù)據(jù)和視頻數(shù)據(jù)播放同步;若調(diào)節(jié)速率為負(fù)值且調(diào)節(jié)速率的絕對(duì)值大于預(yù)設(shè)值,則控制音頻停止播放,以使該音頻數(shù)據(jù)和視頻數(shù)據(jù)播放同步。
[0047]具體的,降低視頻數(shù)據(jù)的播放速率可為將當(dāng)前視頻數(shù)據(jù)的播放速率減去調(diào)節(jié)速率的絕對(duì)值得到新的視頻數(shù)據(jù)的播放速率。增加視頻數(shù)據(jù)的播放速率可為將當(dāng)前視頻數(shù)據(jù)的播放速率增加調(diào)節(jié)速率的絕對(duì)值得到新的視頻數(shù)據(jù)的播放速率。
[0048]上述音視頻同步方法,通過(guò)根據(jù)當(dāng)前播放視頻數(shù)據(jù)的時(shí)間戳和音頻數(shù)據(jù)的時(shí)間戳計(jì)算當(dāng)前音視頻播放的時(shí)間差,并根據(jù)當(dāng)前音視頻播放的時(shí)間差獲取調(diào)節(jié)速率,根據(jù)調(diào)節(jié)速率調(diào)節(jié)視頻播放速率或控制音頻停止播放,使得音頻數(shù)據(jù)和視頻數(shù)據(jù)播放同步,在發(fā)送端網(wǎng)絡(luò)出現(xiàn)卡頓時(shí),并不會(huì)引起接收方播放的視頻和音頻同時(shí)出現(xiàn)卡頓,提高了音頻播放的流暢性,尤其應(yīng)用于在音視頻分開(kāi)采集、編碼和傳輸場(chǎng)景下的視頻直播中音視頻同步,BP便在發(fā)送端網(wǎng)絡(luò)出現(xiàn)擁塞和丟包的場(chǎng)景下,同步也會(huì)在網(wǎng)絡(luò)正常之后恢復(fù),并且聲音播放的流暢性更易于保證。
[0049]在一個(gè)實(shí)施例中,上述音視頻同步方法還包括:若該當(dāng)前音視頻播放的時(shí)間差的絕對(duì)值在預(yù)定范圍內(nèi),則判定該當(dāng)前音視頻播放同步。
[0050]具體的,預(yù)定范圍可根據(jù)需要設(shè)定。
[0051]若該當(dāng)前音視頻播放的時(shí)間差小于或等于預(yù)定上限值,則根據(jù)該當(dāng)前音視頻播放的時(shí)間戳獲取調(diào)節(jié)速率。
[0052]若該當(dāng)前音視頻播放的時(shí)間差大于預(yù)定上限值,則表示該音視頻播放無(wú)法同步。
[0053]具體的,預(yù)定上限值可根據(jù)需要設(shè)定,例如可為3分鐘。若超過(guò)該預(yù)定上限值,則表示采集或傳輸邏輯出現(xiàn)異常,不適合進(jìn)行同步。
[0054]圖3為另一個(gè)實(shí)施例中音視頻同步方法的流程圖。圖3的音視頻同步方法應(yīng)用于圖1的應(yīng)用環(huán)境中。如圖3所示,該音視頻同步方法包括:
[0055]步驟302,將采集的音頻數(shù)據(jù)和視頻數(shù)據(jù)分別標(biāo)記對(duì)應(yīng)的時(shí)間戳。
[0056]在一個(gè)實(shí)施例中,步驟302包括:將采集的第一幀視頻數(shù)據(jù)標(biāo)記對(duì)應(yīng)的系統(tǒng)時(shí)間戳,再第一幀之后每采集到一幀視頻數(shù)據(jù),統(tǒng)計(jì)已采集視頻數(shù)據(jù)的平均幀率,并根據(jù)該平均幀率遞增視頻數(shù)據(jù)的時(shí)間戳,獲取遞增之后的時(shí)間戳與當(dāng)前系統(tǒng)時(shí)間戳的差值;當(dāng)該遞增之后的時(shí)間戳與當(dāng)前系統(tǒng)時(shí)間戳的差值在誤差允許范圍內(nèi),則將該遞增之后的時(shí)間戳作為該視頻數(shù)據(jù)的時(shí)間戳;當(dāng)該遞增之后的時(shí)間戳與當(dāng)前系統(tǒng)時(shí)間戳的差值未在誤差允許范圍內(nèi),則根據(jù)該當(dāng)前系統(tǒng)時(shí)間戳修正該視頻數(shù)據(jù)的時(shí)間戳。
[0057]具體的,平均幀率可以通過(guò)統(tǒng)計(jì)每秒編碼后輸出的數(shù)據(jù)幀,再通過(guò)帶權(quán)平均算法獲得,例如計(jì)算公式為BI = (B0*a+A)>>3來(lái)獲取,其中,BI是更新后的平均幀率;B0是更新前的平均幀率;a為固定參數(shù),可根據(jù)需要設(shè)定,例如a為7或10等;A是新的樣本值,即新采集的視頻幀。初始幀率可由用戶設(shè)定值,以后每秒更新一次當(dāng)前的平均幀率。
[0058]在一個(gè)實(shí)施例中,根據(jù)該平均幀率遞增視頻數(shù)據(jù)的時(shí)間戳具體包括:根據(jù)平均幀率計(jì)算出每次遞增的時(shí)間量值,當(dāng)前視頻幀的時(shí)間戳等于上一視頻幀的時(shí)間戳加上該時(shí)間量值。例如時(shí)間量值為1000/B,B為平均幀率,則Tl = T0+1000/B,其中,Tl為當(dāng)前視頻幀的時(shí)間戳,TO為上一視頻幀的時(shí)間戳。
[0059]在一個(gè)實(shí)施例中,當(dāng)該遞增之后的時(shí)間戳與當(dāng)前系統(tǒng)時(shí)間戳的差值未在誤差允許范圍內(nèi),則根據(jù)該當(dāng)前系統(tǒng)時(shí)間戳修正該視頻數(shù)據(jù)的時(shí)間戳的步驟包括:將當(dāng)前系統(tǒng)時(shí)間戳與遞增之后的時(shí)間戳的差值的一半作為修正值,將遞增之后的時(shí)間戳加上該修正值得到修正后的時(shí)間戳。
[0060]具體的,誤差允許范圍可為根據(jù)需要設(shè)定,例如可為遞增之后的時(shí)間戳小于當(dāng)前系統(tǒng)時(shí)間減去時(shí)間量值的三分之一,或者,遞增之后的時(shí)間戳小于當(dāng)前系統(tǒng)時(shí)間減去時(shí)間量值的二分之一等。
[0061]步驟304,將音頻數(shù)據(jù)及其對(duì)應(yīng)的時(shí)間戳進(jìn)行編碼,并將編碼后的音頻數(shù)據(jù)和對(duì)應(yīng)的時(shí)間戳封裝成音頻數(shù)據(jù)包。
[0062]具體的,音頻數(shù)據(jù)可按照時(shí)間戳順序進(jìn)行編碼,其后的音頻數(shù)據(jù)的解碼也按照時(shí)間戳順序進(jìn)行。
[0063]步驟306,將視頻數(shù)據(jù)及其對(duì)應(yīng)的時(shí)間戳進(jìn)行編碼,并將編碼后的視頻數(shù)據(jù)和編碼后帶出的對(duì)應(yīng)時(shí)間戳封裝成視頻數(shù)據(jù)包。
[0064]具體的,視頻數(shù)據(jù)是一個(gè)圖像組,視頻編碼器對(duì)視頻數(shù)據(jù)進(jìn)行編碼會(huì)重排編碼后的圖像幀數(shù)據(jù),視頻解碼器也會(huì)對(duì)重排后的圖像幀數(shù)據(jù)進(jìn)行恢復(fù)。視頻編碼器對(duì)視頻數(shù)據(jù)編碼后帶出對(duì)應(yīng)的時(shí)間戳,該對(duì)應(yīng)的時(shí)間戳可能與視頻數(shù)據(jù)原來(lái)所對(duì)應(yīng)的時(shí)間戳不同,但視頻解碼器對(duì)編碼后的視頻數(shù)據(jù)進(jìn)行解碼后帶出的時(shí)間戳與視頻數(shù)據(jù)原來(lái)所對(duì)應(yīng)的時(shí)間戳相同,即無(wú)論采用何種方式進(jìn)行編碼和解碼,視頻數(shù)據(jù)在編碼前的時(shí)間戳和解碼后的時(shí)間戳相同。
[0065]視頻數(shù)據(jù)編碼可米用延時(shí)編碼,也可米用零延時(shí)編碼。
[0066]步驟308,發(fā)送該視頻數(shù)據(jù)包和該音頻數(shù)據(jù)包。
[0067]具體的,視頻數(shù)據(jù)編碼采用零延時(shí)編碼時(shí),可在視頻數(shù)據(jù)編碼封裝成視頻數(shù)據(jù)包后直接發(fā)送,音頻數(shù)據(jù)編碼封裝成音頻數(shù)據(jù)包后可直接發(fā)送。
[0068]在一個(gè)實(shí)施例中,上述音視頻同步方法還包括:計(jì)算該視頻數(shù)據(jù)編碼所消耗的延時(shí)時(shí)間;將該音頻數(shù)據(jù)包緩存該延時(shí)時(shí)間后再發(fā)送。
[0069]視頻數(shù)據(jù)采用延時(shí)編碼時(shí),需要計(jì)算視頻數(shù)據(jù)編碼所消耗的延時(shí)時(shí)間,然后將音頻數(shù)據(jù)包緩存延時(shí)時(shí)間后再發(fā)送,以保證音視頻數(shù)據(jù)在傳輸起點(diǎn)的一致性。視頻數(shù)據(jù)延時(shí)因設(shè)定的編碼參數(shù)不同而變化很大,可以從O秒到數(shù)十秒不等。視頻數(shù)據(jù)編碼所消耗的延時(shí)時(shí)間可為接收到第一個(gè)編碼幀的時(shí)間與接收到采集的原始視頻圖像之后記錄的時(shí)間之間的差值。
[0070]步驟310,對(duì)分別接收的音頻數(shù)據(jù)包和視頻數(shù)據(jù)包進(jìn)行解碼得到音頻數(shù)據(jù)的時(shí)間戳和視頻數(shù)據(jù)的時(shí)間戳。
[0071]具體的,接收的音頻數(shù)據(jù)包和視頻數(shù)據(jù)包是經(jīng)過(guò)編碼的,對(duì)接收的音頻數(shù)據(jù)包進(jìn)行解碼得到音頻數(shù)據(jù)及其對(duì)應(yīng)的時(shí)間戳,對(duì)接收的視頻數(shù)據(jù)包進(jìn)行解碼得到視頻數(shù)據(jù)及其對(duì)應(yīng)的時(shí)間戳。音頻數(shù)據(jù)包解碼會(huì)按照時(shí)間戳順序進(jìn)行解碼。視頻數(shù)據(jù)包解碼后會(huì)重排視頻幀的順序,使其和最初采集順序相對(duì)應(yīng)。
[0072]步驟312,獲取當(dāng)前播放視頻數(shù)據(jù)的時(shí)間戳和當(dāng)前播放音頻數(shù)據(jù)的時(shí)間戳。
[0073]具體的,當(dāng)在播放視頻數(shù)據(jù)時(shí),獲取當(dāng)前播放視頻數(shù)據(jù)的時(shí)間戳,并查詢當(dāng)前播放音頻數(shù)據(jù)的時(shí)間戳。
[0074]步驟314,根據(jù)該當(dāng)前播放視頻數(shù)據(jù)的時(shí)間戳和當(dāng)前播放音頻數(shù)據(jù)的時(shí)間戳計(jì)算當(dāng)前音視頻播放的時(shí)間差。
[0075]具體的,將當(dāng)前播放視頻數(shù)據(jù)的時(shí)間戳和當(dāng)前播放音頻數(shù)據(jù)的時(shí)間戳求差值得到當(dāng)前音頻視頻播放的時(shí)間差。
[0076]步驟316,根據(jù)該當(dāng)前音視頻播放的時(shí)間差獲取調(diào)節(jié)速率。
[0077]在一個(gè)實(shí)施例中,該調(diào)節(jié)速率可為當(dāng)前播放視頻數(shù)據(jù)的時(shí)間戳與當(dāng)前播放音頻數(shù)據(jù)的時(shí)間戳之差的線性函數(shù)。
[0078]具體的,播放器的播放速率是由遞交給渲染模塊解碼后圖像數(shù)據(jù)的速率決定的。圖像數(shù)據(jù)的速率取決于一個(gè)時(shí)間間隔TP,理想情況下是TP等于1000/平均幀率,若平均幀率為20幀/毫秒,則該TP為50毫秒。
[0079]當(dāng)計(jì)算出音視頻播放的時(shí)間差TC = TV-TA,其中,TA為音頻數(shù)據(jù)的時(shí)間戳,TV為視頻數(shù)據(jù)的時(shí)間戳。調(diào)節(jié)速率為當(dāng)前播放視頻數(shù)據(jù)的時(shí)間戳與當(dāng)前播放音頻數(shù)據(jù)的時(shí)間戳之差的線性函數(shù),例如可為ACC = A+A*TC/1000,其中,ACC即為調(diào)節(jié)速率,A為一個(gè)基本值,可根據(jù)需要設(shè)置大小,例如,基本值可為5毫秒。在TC很小時(shí),TC對(duì)ACC的影響比較小,當(dāng)TC較大時(shí),TC對(duì)ACC的影響比較大。
[0080]計(jì)算得到一個(gè)真實(shí)遞交給渲染模塊的時(shí)間間隔TR,TR = TC-ACC-TW,其中,Tff是其它處理帶來(lái)的時(shí)間消耗(如取幀,幀數(shù)據(jù)解碼等)。
[0081]ACC為正值時(shí),說(shuō)明視頻數(shù)據(jù)播放比音頻快,TR會(huì)小于TC-TW,視頻數(shù)據(jù)播放會(huì)稍大于預(yù)定的幀率;ACC為負(fù)值時(shí),說(shuō)明視頻數(shù)據(jù)播放比音頻慢,TR會(huì)大于TC-TW,視頻數(shù)據(jù)播放會(huì)小于預(yù)定的幀率。其中,預(yù)定的幀率是指預(yù)先設(shè)定的播放幀率。
[0082]步驟318,根據(jù)該調(diào)節(jié)速率調(diào)節(jié)該視頻播放速率或控制音頻停止播放,以使該音頻數(shù)據(jù)和視頻數(shù)據(jù)播放同步。
[0083]在一個(gè)實(shí)施例中,步驟318包括:該調(diào)節(jié)速率為當(dāng)前播放視頻數(shù)據(jù)的時(shí)間戳與當(dāng)前播放音頻數(shù)據(jù)的時(shí)間戳之差的線性函數(shù);若調(diào)節(jié)速率為正值,則降低該視頻數(shù)據(jù)的播放速率,以使該音頻數(shù)據(jù)和視頻數(shù)據(jù)播放同步;若調(diào)節(jié)速率為負(fù)值,則增加該視頻數(shù)據(jù)的播放速率,以使該音頻數(shù)據(jù)和視頻數(shù)據(jù)播放同步;若調(diào)節(jié)速率為負(fù)值且調(diào)節(jié)速率的絕對(duì)值大于預(yù)設(shè)值,則控制音頻停止播放,以使該音頻數(shù)據(jù)和視頻數(shù)據(jù)播放同步。
[0084]具體的,降低視頻數(shù)據(jù)的播放速率可為將當(dāng)前視頻數(shù)據(jù)的播放速率減去調(diào)節(jié)速率的絕對(duì)值得到新的視頻數(shù)據(jù)的播放速率。增加視頻數(shù)據(jù)的播放速率可為將當(dāng)前視頻數(shù)據(jù)的播放速率增加調(diào)節(jié)速率的絕對(duì)值得到新的視頻數(shù)據(jù)的播放速