一種音視頻同步播放方法及裝置制造方法
【專利摘要】本發(fā)明提供一種音視頻同步播放方法及裝置,該方法包括:接收來自系統(tǒng)的包括視頻數(shù)據(jù)和音頻數(shù)據(jù)的流媒體數(shù)據(jù);讀取流媒體數(shù)據(jù),并記錄讀取流媒體數(shù)據(jù)的起始時(shí)間戳;分別獲取并解析視頻數(shù)據(jù)的數(shù)據(jù)包和音頻數(shù)據(jù)的數(shù)據(jù)包;分別記錄每個(gè)數(shù)據(jù)包的解析時(shí)間戳;將起始時(shí)間戳和視頻解析時(shí)間戳綁定視頻數(shù)據(jù)包作為視頻數(shù)據(jù)樣本;將起始時(shí)間戳和音頻解析時(shí)間戳綁定音頻數(shù)據(jù)包作為音頻數(shù)據(jù)樣本;根據(jù)視頻數(shù)據(jù)樣本和音頻數(shù)據(jù)樣本、以及外部時(shí)鐘同步播放視頻數(shù)據(jù)和音頻數(shù)據(jù)。通過本發(fā)明,能夠有效實(shí)現(xiàn)音視頻的同步播放。
【專利說明】一種音視頻同步播放方法及裝置
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及視頻通信領(lǐng)域,具體地,涉及一種音視頻同步播放方法及裝置。
【背景技術(shù)】
[0002]音視頻同步的目的是將視頻幀與該幀顯示時(shí)間點(diǎn)對(duì)應(yīng)的音頻數(shù)據(jù)同步輸出到設(shè)備,從而實(shí)現(xiàn)影片的正常播放。由于音視頻被分開編碼,故它們的解碼也是分開的,且解碼后的音視頻輸出本是不相關(guān)的過程。為保證正常播放,編碼器在編碼時(shí)會(huì)以幀為單位分別為編碼后的視頻和音頻流打上時(shí)間戳(timestamp,簡(jiǎn)稱為ts),擁有相同或幾近相同時(shí)間戳的音視頻數(shù)據(jù)在解碼后應(yīng)被同時(shí)輸出。
[0003]目前實(shí)現(xiàn)音視頻同步,可以以視頻ts為參考,將音頻同步到視頻,也可相反,以音頻ts為參考,將視頻同步到音頻。此外也可參考外部時(shí)鐘(externalclock),比如系統(tǒng)時(shí)鐘,從而將音視頻根據(jù)各自的ts同步到外部時(shí)鐘。以上的同步過程,如果遇見因機(jī)器性能而解不動(dòng)的情況,采用不解碼相應(yīng)非參考幀的策略,以期減輕系統(tǒng)負(fù)擔(dān),令播放盡可能流暢。
[0004]通常播放器的分離器(demuxer)后端都存在獨(dú)立的音視頻緩沖隊(duì)列,緩沖隊(duì)列內(nèi)存放了由分離器解析出的待解數(shù)據(jù)包。音頻解碼器(audio decoder)從音頻緩沖隊(duì)列中(audio queue)取出音頻數(shù)據(jù)包(audio packet),視頻解碼器(video decoder)從視頻緩沖隊(duì)列中(video queue)取出視頻數(shù)據(jù)包(videopacket),隨后各自解碼并輸出。由于音頻/視頻緩沖隊(duì)列的長(zhǎng)度都有限,因而分離器填充數(shù)據(jù)包時(shí)也就存在限制,如果緩沖隊(duì)列滿了,就必須等隊(duì)列中的數(shù)據(jù)包被對(duì)應(yīng)解碼器取走以騰出空間后方可再次填充。如果分離器具備從隨機(jī)位置單獨(dú)解析出音頻/視頻數(shù)據(jù)包的能力,則該限制影響不大,因?yàn)槿我庖粋€(gè)隊(duì)列的充滿,都不會(huì)影響其他隊(duì)列的填充。反之,如果分離器不具備此能力,就會(huì)出現(xiàn)問題。拿目前的視頻采集、截圖多媒體處理工具(ffmpeg)為例,其分離器不具備上述能力,結(jié)果是音頻/視頻數(shù)據(jù)包被按照數(shù)據(jù)流中出現(xiàn)的順序解析出來的,當(dāng)前循環(huán)解析出的如果是視頻數(shù)據(jù)包,下次的數(shù)據(jù)包類型有可能是視頻,也有可能是音頻。這樣,當(dāng)填充上述緩沖隊(duì)列時(shí),如果視頻緩沖隊(duì)列滿了,就必須讓分離器的解析工作停下來,否則,隨后解析出的視頻數(shù)據(jù)包就無處存放,只能丟棄了。
[0005]由于上述的限制,現(xiàn)有的音視頻同步策略存在的缺陷如下:
[0006]策略I
[0007]以視頻時(shí)間戮(video ts)為參考來同步首頻,該策略的思路是視頻播到哪兒,對(duì)應(yīng)的音頻就播到哪兒。該策略有以下缺陷:
[0008]( I)視頻的時(shí)間戳有很大可能存在不連續(xù);
[0009](2)解不動(dòng)的情況下,視頻緩沖隊(duì)列在大部分時(shí)間是滿的,會(huì)導(dǎo)致音頻數(shù)據(jù)包無法填充;
[0010](3)播放到文件末尾時(shí),視頻數(shù)據(jù)可能先被解完,此時(shí)剩余的音頻(audio)將失去參考對(duì)象。[0011]其中,上述缺陷(I)和(3)可以修正,但會(huì)大大提高程序復(fù)雜度,造成代碼難以維護(hù),缺陷(2)會(huì)令音頻解碼器無數(shù)據(jù)可解,造成嚴(yán)重的聲音卡頓。
[0012]策略2
[0013]以音頻時(shí)間戳為參考來同步視頻,則音頻時(shí)間戳的可靠性通常高于視頻時(shí)間戳的可靠性,但上述策略I中的三個(gè)缺陷仍然存在,且缺陷(2)會(huì)造成視頻失去正確的參考時(shí)間軸,造成視頻長(zhǎng)時(shí)間卡頓,較大影響用戶體驗(yàn)。
[0014]策略3
[0015]將音頻和視頻都同步到同一個(gè)外部時(shí)鐘上,該策略的好處是音頻和視頻彼此不相關(guān)聯(lián),只需要處理各自與外部時(shí)鐘的同步邏輯即可,代碼易讀易維護(hù),出錯(cuò)可能性大大降低,且可以保證選取的外部時(shí)鐘是可靠和一直存在的。但該策略同樣存在如下問題:
[0016](I)同一播放定位(seek)點(diǎn)上,音頻和視頻起始時(shí)間會(huì)不一致;
[0017](2)解不動(dòng)的情況下,視頻緩沖隊(duì)列在大部分時(shí)間是滿的,會(huì)導(dǎo)致音頻數(shù)據(jù)包無法填充。
[0018]問題(I)造成的結(jié)果是,即使音頻和視頻都同步到了外部時(shí)鐘,但起始點(diǎn)內(nèi)容的偏差,導(dǎo)致音視頻始終不同步。盡管在該策略下,問題(2)的影響已降低,但如果處理不當(dāng),仍會(huì)造成聲音的卡頓,影響用戶體驗(yàn)。
[0019]綜上所述,現(xiàn)有技術(shù)中的音視頻同步播放技術(shù)存在由于時(shí)間戳不一致而導(dǎo)致音視頻播放時(shí)無法有效同步的問題。
【發(fā)明內(nèi)容】
[0020]本發(fā)明實(shí)施例的主要目的在于提供一種音視頻同步播放方法及裝置,以解決現(xiàn)有技術(shù)中的音視頻同步播放技術(shù)存在由于時(shí)間戳不一致而導(dǎo)致音視頻播放時(shí)無法有效同步的問題。
[0021]為了實(shí)現(xiàn)上述目的,本發(fā)明提供一種音視頻數(shù)據(jù)的同步播放方法,具體包括:接收來自系統(tǒng)的包括視頻數(shù)據(jù)和音頻數(shù)據(jù)的流媒體數(shù)據(jù);讀取所述流媒體數(shù)據(jù)、并記錄讀取所述流媒體數(shù)據(jù)的起始時(shí)間戳;分別獲取并解析所述視頻數(shù)據(jù)的數(shù)據(jù)包和音頻數(shù)據(jù)的數(shù)據(jù)包;分別記錄每個(gè)數(shù)據(jù)包的解析時(shí)間戳;將所述起始時(shí)間戳和所述視頻解析時(shí)間戳綁定視頻數(shù)據(jù)包作為視頻數(shù)據(jù)樣本;將所述起始時(shí)間戳和所述音頻解析時(shí)間戳綁定音頻數(shù)據(jù)包作為音頻數(shù)據(jù)樣本;根據(jù)所述的視頻數(shù)據(jù)樣本和音頻數(shù)據(jù)樣本、以及外部時(shí)鐘同步播放所述視頻數(shù)據(jù)和音頻數(shù)據(jù)。
[0022]具體地,讀取所述流媒體數(shù)據(jù)并記錄讀取所述流媒體數(shù)據(jù)的起始時(shí)間戳包括:讀取所述流媒體數(shù)據(jù);記錄讀取所述流媒體數(shù)據(jù)中的第一視頻數(shù)據(jù)的起始時(shí)間戳。
[0023]上述將所述起始時(shí)間戳和視頻解析時(shí)間戳綁定視頻數(shù)據(jù)包作為視頻數(shù)據(jù)樣本之后,上述方法還包括:對(duì)所述視頻數(shù)據(jù)樣本進(jìn)行解碼得到視頻幀數(shù)據(jù);將所述起始時(shí)間戳和視頻解析時(shí)間戳綁定所述視頻幀數(shù)據(jù)作為新的視頻數(shù)據(jù)樣本。將所述起始時(shí)間戳和音頻解析時(shí)間戳綁定音頻數(shù)據(jù)包作為音頻數(shù)據(jù)樣本之后,所述方法還包括:對(duì)所述音頻數(shù)據(jù)樣本進(jìn)行解碼得到音頻幀數(shù)據(jù);將所述起始時(shí)間戳和音頻解析時(shí)間戳綁定所述音頻幀數(shù)據(jù)作為新的音頻數(shù)據(jù)樣本。
[0024]上述根據(jù)所述的視頻數(shù)據(jù)樣本和音頻數(shù)據(jù)樣本、以及外部時(shí)鐘同步播放所述視頻數(shù)據(jù)和音頻數(shù)據(jù)包括:根據(jù)所述新的視頻數(shù)據(jù)樣本和新的音頻數(shù)據(jù)樣本、以及外部時(shí)鐘同步播放所述視頻數(shù)據(jù)和音頻數(shù)據(jù)。上述根據(jù)所述新的視頻數(shù)據(jù)樣本和新的音頻數(shù)據(jù)樣本、以及外部時(shí)鐘同步播放所述視頻數(shù)據(jù)和音頻數(shù)據(jù)包括:根據(jù)所述新的視頻數(shù)據(jù)樣本中的起始時(shí)間戳和視頻解析時(shí)間戳獲取當(dāng)前視頻幀流時(shí)間;當(dāng)所述當(dāng)前視頻幀流時(shí)間大于所述外部時(shí)鐘流時(shí)間時(shí),停留預(yù)定時(shí)間后播放當(dāng)前視頻幀,否則,直接播放當(dāng)前視頻幀;根據(jù)所述新的音頻數(shù)據(jù)樣本中的起始時(shí)間戳和音頻解析時(shí)間戳獲取當(dāng)前音頻幀流時(shí)間;當(dāng)所述當(dāng)前音頻幀流時(shí)間與所述外部時(shí)鐘流時(shí)間的時(shí)間差大于預(yù)定閾值時(shí),停止播放當(dāng)前音頻幀,否則播放當(dāng)前音頻中貞。
[0025]為實(shí)現(xiàn)上述目的,本發(fā)明同時(shí)提供一種音視頻數(shù)據(jù)的同步播放裝置,該裝置包括:流媒體數(shù)據(jù)接收單元,用于接收來自系統(tǒng)的包括視頻數(shù)據(jù)和音頻數(shù)據(jù)的流媒體數(shù)據(jù);起始時(shí)間戳記錄單元,用于讀取所述流媒體數(shù)據(jù)、并記錄讀取所述流媒體數(shù)據(jù)的起始時(shí)間戳;流媒體數(shù)據(jù)解析單元,用于分別獲取并解析所述視頻數(shù)據(jù)的數(shù)據(jù)包和音頻數(shù)據(jù)的數(shù)據(jù)包;解析時(shí)間戳記錄單元,用于分別記錄每個(gè)數(shù)據(jù)包的解析時(shí)間戳;視頻數(shù)據(jù)樣本獲取單元,用于將所述起始時(shí)間戳和視頻解析時(shí)間戳綁定視頻數(shù)據(jù)包作為視頻數(shù)據(jù)樣本;音頻數(shù)據(jù)樣本獲取單元,用于將所述起始時(shí)間戳和音頻解析時(shí)間戳綁定音頻數(shù)據(jù)包作為音頻數(shù)據(jù)樣本;音視頻同步播放單元,用于根據(jù)所述的視頻數(shù)據(jù)樣本和音頻數(shù)據(jù)樣本、以及外部時(shí)鐘同步播放所述視頻數(shù)據(jù)和音頻數(shù)據(jù)。
[0026]具體地,所述起始時(shí)間戳記錄單元包括:流媒體數(shù)據(jù)讀取模塊,用于讀取所述流媒體數(shù)據(jù);起始時(shí)間戳記錄模塊,用于記錄讀取所述流媒體數(shù)據(jù)中的第一個(gè)視頻數(shù)據(jù)的起始時(shí)間戳。
[0027]所述的裝置還包括:視頻解碼單元,用于對(duì)所述視頻數(shù)據(jù)樣本進(jìn)行解碼得到視頻幀數(shù)據(jù);新視頻數(shù)據(jù)樣本獲取單元,用于將所述起始時(shí)間戳和視頻解析時(shí)間戳綁定所述視頻幀數(shù)據(jù)作為新的視頻數(shù)據(jù)樣本。
[0028]所述的裝置還包括:音頻解碼單元,用于對(duì)所述音頻數(shù)據(jù)樣本進(jìn)行解碼得到音頻幀數(shù)據(jù);新音頻數(shù)據(jù)樣本獲取單元,用于將所述起始時(shí)間戳和音頻解析時(shí)間戳綁定所述音頻幀數(shù)據(jù)作為新的音頻數(shù)據(jù)樣本。
[0029]其中,所述的音視頻同步播放單元具體用于:根據(jù)所述新的視頻數(shù)據(jù)樣本和新的音頻數(shù)據(jù)樣本、以及外部時(shí)鐘同步所述視頻數(shù)據(jù)和音頻數(shù)據(jù)。
[0030]具體地,所述的音視頻同步播放單元包括:當(dāng)前視頻幀流時(shí)間獲取模塊,用于根據(jù)所述新的視頻數(shù)據(jù)樣本中的起始時(shí)間戳和視頻解析時(shí)間戳獲取當(dāng)前視頻幀流時(shí)間;視頻播放模塊,用于當(dāng)所述當(dāng)前視頻幀流時(shí)間大于所述外部時(shí)鐘流時(shí)間時(shí),停留預(yù)定時(shí)間后播放當(dāng)前視頻幀,否則,直接播放當(dāng)前視頻幀;當(dāng)前音頻幀流時(shí)間獲取模塊,用于根據(jù)所述新的音頻數(shù)據(jù)樣本中的起始時(shí)間戳和音頻解析時(shí)間戳獲取當(dāng)前音頻幀流時(shí)間;音頻播放模塊,用于當(dāng)所述當(dāng)前音頻幀流時(shí)間與所述外部時(shí)鐘流時(shí)間的時(shí)間差大于預(yù)定閾值時(shí),停止播放當(dāng)前音頻巾貞,否則播放所述當(dāng)前音頻中貞。
[0031]借助于上述技術(shù)特征至少之一,本發(fā)明實(shí)施例提供的技術(shù)方案可以克服現(xiàn)有技術(shù)中的由于時(shí)間戳不一致而導(dǎo)致的無法較好地實(shí)現(xiàn)音視頻同步播放的問題,能夠有效實(shí)現(xiàn)音視頻的同步播放?!緦@綀D】
【附圖說明】
[0032]為了更清楚地說明本發(fā)明實(shí)施例或現(xiàn)有技術(shù)中的技術(shù)方案,下面將對(duì)實(shí)施例描述中所需要使用的附圖作簡(jiǎn)單地介紹,顯而易見地,下面描述中的附圖僅僅是本發(fā)明的一些實(shí)施例,對(duì)于本領(lǐng)域普通技術(shù)人員來講,在不付出創(chuàng)造性勞動(dòng)性的前提下,還可以根據(jù)這些附圖獲得其他的附圖。
[0033]圖1是根據(jù)本發(fā)明實(shí)施例的音視頻同步播放方法的流程圖;
[0034]圖2是根據(jù)本發(fā)明實(shí)施例的音視頻播放器的系統(tǒng)架構(gòu)圖;
[0035]圖3是根據(jù)本發(fā)明實(shí)施例的分離器對(duì)音視頻數(shù)據(jù)的處理流程圖;
[0036]圖4是根據(jù)本發(fā)明實(shí)施例的視頻解碼器的處理流程圖;
[0037]圖5是根據(jù)本發(fā)明實(shí)施例的音頻解碼器的處理流程圖;
[0038]圖6是根據(jù)本發(fā)明實(shí)施例的視頻渲染器的同步流程圖;
[0039]圖7是根據(jù)本發(fā)明實(shí)施例的音頻渲染器的同步流程圖;
[0040]圖8是根據(jù)本發(fā)明實(shí)施例的優(yōu)化CPU資源不足時(shí)的處理流程圖;
[0041]圖9是根據(jù)本發(fā)明實(shí)施例的音視頻同步播放裝置的結(jié)構(gòu)框圖;
[0042]圖10是根據(jù)本發(fā)明實(shí)施例的起始時(shí)間戳記錄單元結(jié)構(gòu)圖;
[0043]圖11是根據(jù)本發(fā)明實(shí)施例的音視頻同步播放裝置的具體結(jié)構(gòu)框圖;
[0044]圖12是根據(jù)本發(fā)明實(shí)施例的音視頻同步播放裝置的另一個(gè)具體結(jié)構(gòu)框圖;
[0045]圖13是根據(jù)本發(fā)明實(shí)施例的音視頻同步播放單元的結(jié)構(gòu)框圖。
【具體實(shí)施方式】
[0046]下面將結(jié)合本發(fā)明實(shí)施例中的附圖,對(duì)本發(fā)明實(shí)施例中的技術(shù)方案進(jìn)行清楚、完整地描述,顯然,所描述的實(shí)施例僅僅是本發(fā)明一部分實(shí)施例,而不是全部的實(shí)施例?;诒景l(fā)明中的實(shí)施例,本領(lǐng)域普通技術(shù)人員在沒有作出創(chuàng)造性勞動(dòng)前提下所獲得的所有其他實(shí)施例,都屬于本發(fā)明保護(hù)的范圍。
[0047]由于現(xiàn)有技術(shù)中的音視頻同步播放技術(shù)存在由于時(shí)間戳不一致而導(dǎo)致音視頻播放時(shí)無法有效同步的問題,基于此,本發(fā)明實(shí)施例提供一種音視頻同步播放方法及裝置,以解決上述問題。以下結(jié)合附圖對(duì)本發(fā)明進(jìn)行詳細(xì)說明。
[0048]實(shí)施例一
[0049]本發(fā)明實(shí)施例提供一種音視頻同步播放方法。圖1是根據(jù)本發(fā)明實(shí)施例的音視頻同步播放方法的流程圖,如圖1所示,該方法包括:
[0050]步驟101:接收來自系統(tǒng)的包括視頻數(shù)據(jù)和音頻數(shù)據(jù)的流媒體數(shù)據(jù);
[0051]步驟102:讀取流媒體數(shù)據(jù)、并記錄讀取流媒體數(shù)據(jù)的起始時(shí)間戳;
[0052]步驟103:分別獲取并解析視頻數(shù)據(jù)的數(shù)據(jù)包和音頻數(shù)據(jù)的數(shù)據(jù)包;
[0053]步驟104:分別記錄每個(gè)數(shù)據(jù)包的解析時(shí)間戳;
[0054]步驟105:將起始時(shí)間戳和視頻解析時(shí)間戳綁定視頻數(shù)據(jù)包作為視頻數(shù)據(jù)樣本;
[0055]步驟106:將起始時(shí)間戳和音頻解析時(shí)間戳綁定音頻數(shù)據(jù)包作為音頻數(shù)據(jù)樣本;
[0056]步驟107:根據(jù)視頻數(shù)據(jù)樣本和音頻數(shù)據(jù)樣本、以及外部時(shí)鐘同步播放視頻數(shù)據(jù)和音頻數(shù)據(jù)。
[0057]由以上描述可以看出,通過記錄讀取的流媒體數(shù)據(jù)的起始時(shí)間戳以及記錄每個(gè)數(shù)據(jù)包的解析時(shí)間戳,并將起始時(shí)間戳和視頻解析時(shí)間戳綁定視頻數(shù)據(jù)包作為視頻數(shù)據(jù)樣本,將起始時(shí)間戳和音頻解析時(shí)間戳綁定音頻數(shù)據(jù)包作為音頻數(shù)據(jù)樣本,之后根據(jù)視頻數(shù)據(jù)樣本和音頻數(shù)據(jù)樣本、以及外部時(shí)鐘同步播放視頻數(shù)據(jù)和音頻數(shù)據(jù),相比于現(xiàn)有技術(shù)中的由于時(shí)間戳不一致而導(dǎo)致的無法較好地實(shí)現(xiàn)音視頻同步播放的技術(shù),本發(fā)明實(shí)施例提供的技術(shù)方案能夠有效實(shí)現(xiàn)音視頻的同步播放。
[0058]上述的外部時(shí)鐘可以是一個(gè)可靠的外部時(shí)鐘(external clock),該外部時(shí)鐘作為參考時(shí)鐘,必須是連續(xù)遞增的。在實(shí)際操作中,可以選取系統(tǒng)時(shí)鐘或系統(tǒng)開機(jī)后所經(jīng)歷的時(shí)間,時(shí)鐘單位至少需要精確到毫秒級(jí)。
[0059]具體地,上述步驟102中讀取流媒體數(shù)據(jù)并記錄讀取流媒體數(shù)據(jù)的起始時(shí)間戳包括:讀取流媒體數(shù)據(jù);記錄讀取流媒體數(shù)據(jù)中的第一個(gè)視頻數(shù)據(jù)的起始時(shí)間戳。
[0060]上述步驟105:將起始時(shí)間戳和視頻解析時(shí)間戳綁定視頻數(shù)據(jù)包作為視頻數(shù)據(jù)樣本之后,上述方法還包括:對(duì)視頻數(shù)據(jù)樣本進(jìn)行解碼得到視頻幀數(shù)據(jù);將起始時(shí)間戳和視頻解析時(shí)間戳綁定視頻幀數(shù)據(jù)作為新的視頻數(shù)據(jù)樣本。
[0061]上述步驟106:將起始時(shí)間戳和音頻解析時(shí)間戳綁定音頻數(shù)據(jù)包作為音頻數(shù)據(jù)樣本之后,上述方法還包括:對(duì)音頻數(shù)據(jù)樣本進(jìn)行解碼得到音頻幀數(shù)據(jù);將起始時(shí)間戳和音頻解析時(shí)間戳綁定音頻幀數(shù)據(jù)作為新的音頻數(shù)據(jù)樣本。
[0062]具體地,根據(jù)上述獲取的新的視頻數(shù)據(jù)樣本和新的音頻數(shù)據(jù)樣本,步驟107可以根據(jù)新的視頻數(shù)據(jù)樣本和新的音頻數(shù)據(jù)樣本、以及外部時(shí)鐘同步播放視頻數(shù)據(jù)和音頻數(shù)據(jù)來實(shí)現(xiàn)。具體實(shí)現(xiàn)過程為:根據(jù)新的視頻數(shù)據(jù)樣本中的起始時(shí)間戳和視頻解析時(shí)間戳獲取當(dāng)前視頻幀流時(shí)間;當(dāng)當(dāng)前視頻幀流時(shí)間大于外部時(shí)鐘流時(shí)間時(shí),停留預(yù)定時(shí)間后播放當(dāng)前視頻幀,否則,直接播放當(dāng)前視頻幀;根據(jù)新的音頻數(shù)據(jù)樣本中的起始時(shí)間戳和音頻解析時(shí)間戳獲取當(dāng)前音頻幀流時(shí)間;當(dāng)當(dāng)前音頻幀流時(shí)間與外部時(shí)鐘流時(shí)間的時(shí)間差大于預(yù)定閾值時(shí),停止播放當(dāng)前音頻幀,否則播放上述當(dāng)前音頻幀。
[0063]在實(shí)際操作中,要實(shí)現(xiàn)同步音視頻,首先需要選取一個(gè)可靠的外部時(shí)鐘作為參考時(shí)鐘,該時(shí)鐘必須是連續(xù)遞增的。該外部時(shí)鐘可以是系統(tǒng)時(shí)鐘或系統(tǒng)開機(jī)后所經(jīng)歷的時(shí)間,時(shí)鐘單位至少需要精確到毫秒級(jí)。
[0064]在具體實(shí)施過程中,該外部時(shí)鐘可以是系統(tǒng)時(shí)鐘,直接從系統(tǒng)時(shí)鐘獲得的時(shí)間稱為系統(tǒng)絕對(duì)時(shí)間(system time),以某個(gè)system time為起始時(shí)間,而后所經(jīng)歷的時(shí)間可以稱為系統(tǒng)相對(duì)時(shí)間,也叫系統(tǒng)流時(shí)間(system stream time)。
[0065]在同步音視頻過程中,還存在音頻流時(shí)間(audio stream time)和視頻流時(shí)間(video stream time),與上述的系統(tǒng)時(shí)鐘計(jì)算方式相同,都是用當(dāng)前數(shù)據(jù)巾貞的ts減去之前記錄下的某個(gè)起始數(shù)據(jù)巾貞的ts來獲得。
[0066]本發(fā)明實(shí)施例中的同步原理是:在起始時(shí)間相同的情況下,將音頻流時(shí)間(audiostream time)和視頻流時(shí)間(video stream time)同時(shí)同步到 systemstream time,對(duì)audio/video stream time來講,這里的起始時(shí)間是指記下起始數(shù)據(jù)巾貞ts時(shí)的系統(tǒng)絕對(duì)時(shí)間。
[0067]為了更好地理解本發(fā)明實(shí)施例,以下以音視頻播放器為例來詳細(xì)描述本發(fā)明實(shí)施例。
[0068]首先,描述音視頻播放器的系統(tǒng)架構(gòu),圖2是根據(jù)本發(fā)明實(shí)施例的音視頻播放器的系統(tǒng)架構(gòu)圖,如圖2所示:
[0069]該播放器包括:分離器I (demuxer)、視頻解碼器2 (video decoder),音頻解碼器4 (audio decoder),視頻值染器 3 (video renderer)和音頻值染器 5 (audio renderer)。其中,Demuxer負(fù)責(zé)從流媒體中讀取流數(shù)據(jù),再將流數(shù)據(jù)中的音視頻數(shù)據(jù)包分析出來,最后將分析出的音視頻數(shù)據(jù)包分別存入相應(yīng)的緩沖隊(duì)列中,供video/audio decoder取出使用。Video decoder負(fù)責(zé)從視頻緩沖隊(duì)列中取出視頻數(shù)據(jù)包進(jìn)行視頻解碼,并將解碼后的幀數(shù)據(jù)和該巾貞的ts等重要信息打包,存入視頻輸出隊(duì)列。Video renderer負(fù)責(zé)從視頻輸出隊(duì)列中取出包,實(shí)現(xiàn)同步播放,Audio decoder和audio renderer的功能與視頻(video)分支類似。
[0070]Demuxer首先接收音視頻數(shù)據(jù),然后經(jīng)過解碼器后到達(dá)渲染器(Renderer),從而實(shí)現(xiàn)音視頻的同步播放。
[0071]以下描述該播放器實(shí)現(xiàn)音視頻數(shù)據(jù)的同步播放流程。
[0072]播放器在剛打開或每次進(jìn)行播放定位(seek)操作后,參考時(shí)鐘歸零重計(jì),Demuxer清空緩沖隊(duì)列,并開始重新為解碼器(decoder)提供數(shù)據(jù)。Demuxer首先需記下解析出的第一個(gè)video packet的ts,記為同步點(diǎn)時(shí)間戳(sync point ts),也稱為起始時(shí)間戳。后面解析出的每個(gè)數(shù)據(jù)包,無論video還是audio,除綁定其自身的ts外,還需綁定之前記下的sync point ts,作為一個(gè)樣本(sample)被放入對(duì)應(yīng)的緩沖隊(duì)列中。該sample至少包含以下幾項(xiàng):
[0073]1.存放數(shù)據(jù)包的緩沖區(qū)(buffer)
[0074]2.數(shù)據(jù)包的ts
[0075]3.Sync point ts
[0076]圖3是根據(jù)本發(fā)明實(shí)施例的分離器對(duì)音視頻數(shù)據(jù)的處理流程圖,具體的流程如圖3所示:
[0077]步驟301,接收來自系統(tǒng)或外部網(wǎng)絡(luò)的流媒體數(shù)據(jù),該流媒體數(shù)據(jù)包括視頻數(shù)據(jù)和音頻數(shù)據(jù);
[0078]步驟302,判斷當(dāng)前文件位置是否為文件結(jié)尾,如果是,則退出判斷,否則進(jìn)行步驟S303 ;
[0079]步驟303,判斷是否是第一次打開播放器或播放定位操作后,如果是,則進(jìn)行步驟304,否則進(jìn)行步驟306 ;
[0080]步驟304,清空緩沖隊(duì)列,并進(jìn)行步驟305 ;
[0081]步驟305:獲取隨后第一個(gè)視頻數(shù)據(jù)包的解析時(shí)間戳,記為起始時(shí)間戳,并進(jìn)行步驟 306 ;
[0082]步驟306,讀出下一個(gè)數(shù)據(jù)包的數(shù)據(jù),并記錄此時(shí)數(shù)據(jù)包的數(shù)據(jù)的解析時(shí)間戳;
[0083]步驟307:判斷數(shù)據(jù)包的類型;如果數(shù)據(jù)包的類型是視頻數(shù)據(jù)包,則進(jìn)行步驟308和309,如果數(shù)據(jù)包的類型是音頻數(shù)據(jù)包,則進(jìn)行步驟310和步驟311 ;
[0084]步驟308,創(chuàng)建一個(gè)視頻數(shù)據(jù)樣本;
[0085]步驟309,將該視頻數(shù)據(jù)樣本存入到視頻緩沖隊(duì)列中,并返回到步驟302 ;
[0086]步驟310,創(chuàng)建一個(gè)音頻數(shù)據(jù)樣本;
[0087]步驟311:將該音頻數(shù)據(jù)樣本存入到音頻緩沖隊(duì)列中,并返回到步驟302。[0088]隨后,當(dāng)video queue 和 audio queue 中存在 sample 后,video decoder 和音頻audio decoder就可以從queue中取出sample,獲取其中的數(shù)據(jù)包進(jìn)行解碼。
[0089]下面將結(jié)合附圖,對(duì)解碼器的處理過程進(jìn)行描述。
[0090]圖4是根據(jù)本發(fā)明實(shí)施例的視頻解碼器的處理流程圖,具體的解碼過程如圖4所示:
[0091]步驟401:開始解碼視頻幀過程,并進(jìn)行步驟402 ;
[0092]步驟402:判斷視頻緩沖隊(duì)列是否為空,當(dāng)視頻緩沖隊(duì)列為空時(shí),則進(jìn)行到步驟403,當(dāng)視頻緩沖隊(duì)列不為空時(shí),則進(jìn)行步驟404 ;
[0093]步驟403:等待視頻數(shù)據(jù)到來,并返回到步驟402 ;
[0094]步驟404:取出下一個(gè)視頻數(shù)據(jù)樣本,并進(jìn)行步驟405 ;
[0095]步驟405:解碼視頻數(shù)據(jù)樣本中的視頻數(shù)據(jù)包,生成解碼后的幀數(shù)據(jù),并進(jìn)行步驟406 ;
[0096]步驟406:判斷視頻數(shù)據(jù)樣本中的解析時(shí)間戳是否連續(xù),如果解析時(shí)間戳不連續(xù),則進(jìn)行步驟407,如果解析時(shí)間戳連續(xù),則進(jìn)行到步驟408 ;
[0097]步驟407:對(duì)視頻數(shù)據(jù)樣本中的解析時(shí)間戳做容錯(cuò)處理;
[0098]步驟408:綁定解碼后的幀數(shù)據(jù)、幀數(shù)據(jù)的解析時(shí)間戳、起始時(shí)間戳,以創(chuàng)建視頻輸出樣本,并進(jìn)行步驟409 ;
[0099]步驟409:判斷視頻輸出隊(duì)列是否已滿,當(dāng)視頻輸出隊(duì)列已滿時(shí),則進(jìn)行到步驟410 ;當(dāng)視頻輸出隊(duì)列未滿時(shí),則進(jìn)行步驟411 ;
[0100]步驟410:等待視頻輸出隊(duì)列騰出空間,并返回進(jìn)行步驟409 ;
[0101]步驟411:將視頻輸出樣本填入視頻輸出隊(duì)列,并進(jìn)行步驟412 ;
[0102]步驟412:判斷是否終止解碼,當(dāng)要終止解碼時(shí),則進(jìn)行步驟413 ;當(dāng)不終止解碼時(shí),則返回至步驟401 ;
[0103]步驟413:結(jié)束解碼。
[0104]圖5是根據(jù)本發(fā)明實(shí)施例的音頻解碼器的處理流程圖,具體的音頻解碼過程如圖5所示:
[0105]步驟501:開始解碼音頻幀過程,并進(jìn)行步驟502 ;
[0106]步驟502:判斷音頻緩沖隊(duì)列是否為空,當(dāng)音頻緩沖隊(duì)列為空時(shí),則進(jìn)行到步驟503,當(dāng)音頻緩沖隊(duì)列不為空時(shí),則進(jìn)行步驟504 ;
[0107]步驟503:等待音頻數(shù)據(jù)到來,并返回到步驟502 ;
[0108]步驟504:取出下一個(gè)音頻數(shù)據(jù)樣本,并進(jìn)行步驟505 ;
[0109]步驟505:解碼音頻數(shù)據(jù)樣本中的音頻數(shù)據(jù)包,生成解碼后的幀數(shù)據(jù),并進(jìn)行步驟506 ;
[0110]步驟506:判斷音頻數(shù)據(jù)樣本中的解析時(shí)間戳是否連續(xù),如果解析時(shí)間戳不連續(xù),則進(jìn)行步驟507,如果解析時(shí)間戳連續(xù),則進(jìn)行到步驟508 ;
[0111]步驟507:對(duì)音頻數(shù)據(jù)樣本中的解析時(shí)間戳做容錯(cuò)處理;
[0112]步驟508:綁定解碼后的幀數(shù)據(jù)、幀數(shù)據(jù)的解析時(shí)間戳、起始時(shí)間戳,以創(chuàng)建音頻輸出樣本,并進(jìn)行步驟509 ;
[0113]步驟509:判斷音頻輸出隊(duì)列是否已滿,當(dāng)音頻輸出隊(duì)列已滿時(shí),則進(jìn)行到步驟510 ;當(dāng)音頻輸出隊(duì)列未滿時(shí),則進(jìn)行步驟511 ;
[0114]步驟510:等待音頻輸出隊(duì)列騰出空間,并返回進(jìn)行步驟509 ;
[0115]步驟511:將音頻輸出樣本填入音頻輸出隊(duì)列,并進(jìn)行步驟512 ;
[0116]步驟512:判斷是否終止解碼,當(dāng)要終止解碼時(shí),則進(jìn)行步驟513 ;當(dāng)不終止解碼時(shí),則返回至步驟501 ;
[0117]步驟513:直接結(jié)束解碼。
[0118]上述過程中,由于視頻編解碼存在參考幀的解碼順序和輸出順序不同的問題,故需要對(duì)輸出的ts做重排,將packet的ts重新正確地綁定到解碼后的輸出幀上。之后,video/audio decoder還需要根據(jù)ts的具體情況做一些容錯(cuò)處理,保證ts不會(huì)出現(xiàn)錯(cuò)誤的巨大跳躍。之后,將解出的音視頻數(shù)據(jù)連同其對(duì)應(yīng)的ts再打包成相應(yīng)的sample,存入到輸出隊(duì)列中。整個(gè)過程,第一個(gè)視頻數(shù)據(jù)的解析時(shí)間戳不發(fā)生變化,但必須被復(fù)制到新的sample 中。
[0119]上述容錯(cuò)處理是指:正常情況下,連接的時(shí)間戳是均勻遞增的,但有可能出現(xiàn)非均勻遞增的情況。這時(shí)要把它的值強(qiáng)行修改,使它的值盡量是均勻遞增的。也就是說,在時(shí)間戳重排之后,處理個(gè)別不正常的時(shí)間戳,不是必要的操作。
[0120]由以上描述可知,通過視頻或音頻解碼器,將解碼出的音視頻數(shù)據(jù)連同其對(duì)應(yīng)的ts再打包成相應(yīng)的sample,存入到輸出隊(duì)列中。整個(gè)過程,第一個(gè)視頻數(shù)據(jù)的解析時(shí)間戳不發(fā)生變化,但必須被復(fù)制到新的sample中,如此便保證了音頻和視頻解碼中,具有相同的起點(diǎn)(使用同一個(gè)起始時(shí)間戳,即第一個(gè)視頻數(shù)據(jù)的解析時(shí)間戳)。
[0121]完成上述視頻和音頻的解碼處理后,下一步則是根據(jù)上述過程中創(chuàng)建的視頻和音頻輸出樣本進(jìn)行同步播放,同步播放過程里起決定作用的是renderer部分。Videorenderer負(fù)責(zé)將視頻同步到system stream time, audio renderer負(fù)責(zé)將音頻同步到system stream time。由于音視頻自身的流時(shí)間是確定的,只要用當(dāng)前播放的ts減去syncpoint ts:
[0122]Audio/video stream time=current audio/video ts - sync point ts
[0123]并且,由于音視頻的流時(shí)間具有相同的起點(diǎn)(使用同一個(gè)sync point ts),故可以解決開始位置音頻和視頻存在前后差異的問題。這樣,只需要將視頻流時(shí)間和音頻流時(shí)間(video和audio的stream time)各自同步到system streamtime上,就很好的完成了整個(gè)同步過程。
[0124]對(duì)video renderer來說,同步的具體過程如下:
[0125]如果video stream time>system stream time,表明 video數(shù)據(jù)解得較快,早于其顯示時(shí)間,此時(shí)等待一段時(shí)間,等待完畢再顯示當(dāng)前幀,其中,該時(shí)間長(zhǎng)度為:
[0126]等待時(shí)間(wait time) =video stream time - system stream time
[0127]如果video stream time<system stream time,表明 video數(shù)據(jù)解得較慢,晚于其顯示時(shí)間,此時(shí)直接顯示該巾貞,不做任何等待。
[0128]記延遲時(shí)間(late time)=system stream time - video stream time。如果 latetime大于預(yù)定閾值(threshold),則發(fā)動(dòng)自動(dòng)化質(zhì)量(auto quality)反饋機(jī)制,讓videodecoder只解參考巾貞,丟棄非參考巾貞。如果late time小于該threshold,則解碼過程恢復(fù)常態(tài),即解碼所有幀。[0129]其中,本發(fā)明實(shí)施例中,觸發(fā)自動(dòng)化質(zhì)量反饋機(jī)制的預(yù)定閾值為200ms。S卩,如果late time大于200ms,則發(fā)動(dòng)自動(dòng)化質(zhì)量(auto quality)反饋機(jī)制,讓video decoder只解參考幀,丟棄非參考幀。如果late time小于200ms,則解碼過程恢復(fù)常態(tài),即解碼所有幀。
[0130]下面將結(jié)合附圖分別對(duì)視頻渲染器和音頻渲染器的同步過程進(jìn)行說明。
[0131]圖6是根據(jù)本發(fā)明實(shí)施例的視頻渲染器的同步流程圖,具體的同步流程如圖6所示:
[0132]步驟601:計(jì)算視頻幀數(shù)據(jù)的視頻幀流時(shí)間,并進(jìn)行步驟602 ;
[0133]步驟602:獲取當(dāng)前系統(tǒng)流時(shí)間,并進(jìn)行到步驟603 ;
[0134]步驟603:判斷視頻幀流時(shí)間是否大于當(dāng)前系統(tǒng)流時(shí)間,如果視頻幀流時(shí)間大于當(dāng)前系統(tǒng)流時(shí)間,則進(jìn)行步驟604,如果視頻幀流時(shí)間不大于當(dāng)前系統(tǒng)流時(shí)間,則直接進(jìn)行步驟605 ;
[0135]步驟604:等待一段時(shí)間(wait time),并進(jìn)行到步驟605 ;
[0136]步驟605:顯示當(dāng)前視頻幀數(shù)據(jù),并進(jìn)行步驟606 ;
[0137]步驟606:計(jì)算延遲時(shí)間,并進(jìn)行步驟607 ;
[0138]步驟607:判斷延遲時(shí)間是否大于預(yù)定閾值,當(dāng)延遲時(shí)間大于預(yù)定閾值時(shí),則進(jìn)行步驟608,當(dāng)延遲時(shí)間不大于預(yù)定閾值時(shí),則進(jìn)行步驟609 ;
[0139]步驟608:發(fā)動(dòng)自動(dòng)化質(zhì)量反饋機(jī)制;
[0140]步驟609:關(guān)閉自動(dòng)化質(zhì)量反饋機(jī)制,并進(jìn)行步驟610 ;
[0141]步驟610:結(jié)束同步過程。
[0142]在各種平臺(tái)上,由于audio部分的數(shù)據(jù)輸出表現(xiàn)有別于video,所以同步的策略也有一些不同。這里的不同之處在于,audio輸出設(shè)備會(huì)自動(dòng)根據(jù)audio的采樣率(samplingrate),聲道數(shù)(sound channel count)和采樣精度來播放音頻,播放時(shí)的速度快慢不需要人為管理,人為需要管理的僅僅是從數(shù)據(jù)段的那個(gè)位置開始將數(shù)據(jù)輸入音頻設(shè)備。也就是說,如果當(dāng)前音頻播放落后于被該播放的時(shí)間位置,則需要人為跳過落后的數(shù)據(jù)段部分,直接定位到當(dāng)前應(yīng)該輸出的位置,從該位置將數(shù)據(jù)交給音頻設(shè)備。相反,如果當(dāng)前播放位置提前于實(shí)際播放位置,應(yīng)該等待相應(yīng)時(shí)間,期間停止發(fā)送數(shù)據(jù)給音頻設(shè)備。
[0143]具體的音頻同步過程如下:
[0144]1.計(jì)算時(shí)間差值(Difference time):
[0145]Difference time=audio stream time-system stream time
[0146]如果Difference time>threshold top,表明解碼速度快于實(shí)際播放速度,需要等待,期間不給音頻設(shè)備任何數(shù)據(jù)。這里的Difference time即是上述當(dāng)前音頻巾貞流時(shí)間與外部時(shí)鐘流時(shí)間的時(shí)間差,threshoId top為最大預(yù)定閾值,例如,該最大預(yù)定閾值為35ms。
[0147]如果Difference time<threshold bottom,表明解碼速度低于實(shí)際播放速度,此時(shí)計(jì)算應(yīng)該跳過的數(shù)據(jù)長(zhǎng)度。計(jì)算的目的在于保證輸出給音頻設(shè)備的數(shù)據(jù)對(duì)應(yīng)的Difference time滿足如下條件:
[0148]threshold bottom<Difference time<threshold top
[0149]其中,上述threshold bottom為最小預(yù)定閾值,例如,該最小預(yù)定閾值為_65ms。
[0150]圖7是根據(jù)本發(fā)明實(shí)施例的音頻渲染器的同步流程圖,具體的同步流程如圖7所示:
[0151]步驟701:計(jì)算音頻幀數(shù)據(jù)的音頻幀流時(shí)間,并進(jìn)行步驟702 ;
[0152]步驟702:獲取當(dāng)前系統(tǒng)流時(shí)間,并進(jìn)行步驟703 ;
[0153]步驟703:計(jì)算時(shí)間差值,并進(jìn)行步驟704 ;
[0154]步驟704:判斷時(shí)間差值是否大于threshold top,當(dāng)時(shí)間差值大于thresholdtop時(shí),則進(jìn)行到步驟705,當(dāng)時(shí)間差值不大于threshold top時(shí),則進(jìn)行到步驟706 ;
[0155]步驟705:等待相鄰音頻幀數(shù)據(jù)的間隔時(shí)間,該間隔時(shí)間可以是小于等于23ms,完成此步驟后返回到步驟701 ;
[0156]步驟706:判斷時(shí)間差值是否小于threshold bottom,當(dāng)時(shí)間差值小于所述threshold bottom時(shí),則進(jìn)行到步驟707,當(dāng)時(shí)間差值不小于threshold bottom時(shí),則進(jìn)行步驟709 ;
[0157]步驟707:計(jì)算跳過的數(shù)據(jù)段的長(zhǎng)度,并進(jìn)行步驟708 ;
[0158]步驟708:取新位置的音頻幀數(shù)據(jù),并返回到步驟701 ;
[0159]步驟709:輸出音頻幀數(shù)據(jù),并進(jìn)行步驟710 ;
[0160]步驟710:結(jié)束當(dāng)前音頻同步過程。
[0161]其中,上述內(nèi)容中的threshold top和threshold bottom可憑經(jīng)驗(yàn)給出。由于相鄰音頻幀數(shù)據(jù)的間隔時(shí)間均小于等于23ms,故等待時(shí)間必須匹配相鄰音頻幀數(shù)據(jù)的間隔時(shí)間。實(shí)際情況中,跳過的數(shù)據(jù)段長(zhǎng)度通常等于當(dāng)前音頻設(shè)備需要取得數(shù)據(jù)幀的尺寸(size),該尺寸(size)只能被播放23ms以下的時(shí)間,因?yàn)楹苄。钥梢灾苯尤縼G棄,直到遇見合適的位置,即Difference time滿足上述條件即可。
[0162]以上便是整個(gè)音視頻同步的主要流程。在CPU資源夠用的時(shí)候,以上流程已可正確處理音視頻同步,但當(dāng)CPU資源緊張時(shí),還需要添加額外的優(yōu)化技術(shù)。
[0163]由于視頻解碼對(duì)CPU的資源消耗遠(yuǎn)遠(yuǎn)高于音頻解碼,故通常都是聲音解得動(dòng)而視頻卡。此時(shí),系統(tǒng)中與audio相關(guān)的緩沖隊(duì)列通常是空的,相反,video卻是滿的。上文曾經(jīng)提到,如果demuxer不支持隨機(jī)單獨(dú)提取audio或videopacket的能力,貝U當(dāng)video queue滿載時(shí),audio queue將無法被填充,造成audiodecoder無數(shù)據(jù)可解,這樣帶來的后果是圖像卡的同時(shí)聲音也卡。
[0164]基于上述問題,本發(fā)明實(shí)施例提供如下優(yōu)化方式:
[0165]首先,定期去查詢當(dāng)前audio decoder后端的audio輸出隊(duì)列是否為空;如果上述檢查為空,再去檢查demuxer后端的audio queue是否為空且video queue是否滿載;如果demuxer檢查結(jié)果為是,則通知video decoder按順序取出videoqueue中所有的videosample,并讓video decoder在隨后的解碼中等待關(guān)鍵巾貞的到來。其中,上述關(guān)鍵巾貞也稱為I幀,是指視頻編碼中幀內(nèi)預(yù)測(cè)編碼幀,它是可以不用參考其他視頻編碼幀就可以重構(gòu)出圖像的幀。
[0166]圖8是根據(jù)本發(fā)明實(shí)施例的優(yōu)化CPU資源不足時(shí)的處理流程圖,具體的處理流程如圖8所示:
[0167]步驟801:定期查詢音頻輸出隊(duì)列是否為空,當(dāng)音頻輸出隊(duì)列為空時(shí),則進(jìn)行到步驟802,否則繼續(xù)定期查詢音頻輸出隊(duì)列是否為空;
[0168]步驟802:判斷分離器的音頻緩沖隊(duì)列是否為空且視頻緩沖隊(duì)列是否為滿,當(dāng)分離器的音頻緩沖隊(duì)列為空且視頻緩沖隊(duì)列為滿時(shí),則進(jìn)行步驟803,當(dāng)分離器的音頻緩沖隊(duì)列不為空、或視頻緩沖隊(duì)列不滿時(shí),則返回至步驟801 ;
[0169]步驟803:視頻解碼器按序取出視頻緩沖隊(duì)列中的樣本,直接丟棄,并進(jìn)行步驟804 ;
[0170]步驟804:讓視頻解碼器等到下一個(gè)關(guān)鍵幀才開始解碼,并進(jìn)行步驟805 ;
[0171]步驟805:優(yōu)化過程終止。
[0172]通過上述實(shí)施例可知,本發(fā)明實(shí)施例提供的技術(shù)方案能夠以外部時(shí)鐘externalclock為同步源,解決音視頻由于起始時(shí)間戳不一致造成的無法較好地實(shí)現(xiàn)同步播放的問題。同時(shí),又采用了新的優(yōu)化技術(shù),較大程度緩解CPU解不動(dòng)時(shí)音視頻的卡頓現(xiàn)象,以提高用戶體驗(yàn)。
[0173]實(shí)施例二
[0174]本發(fā)明實(shí)施例提供一種音視頻同步播放裝置,該裝置優(yōu)選地用于實(shí)現(xiàn)上述實(shí)施例一中的方法。圖9是根據(jù)本發(fā)明實(shí)施例的音視頻同步播放裝置的結(jié)構(gòu)框圖,如圖9所示,該裝置包括:
[0175]流媒體數(shù)據(jù)接收單元901,用于接收來自系統(tǒng)的包括視頻數(shù)據(jù)和音頻數(shù)據(jù)的流媒體數(shù)據(jù);
[0176]起始時(shí)間戳記錄單元902,用于讀取流媒體數(shù)據(jù)、并記錄讀取流媒體數(shù)據(jù)的起始時(shí)間戳;
[0177]流媒體數(shù)據(jù)解析單元903,用于分別獲取并解析視頻數(shù)據(jù)的數(shù)據(jù)包和音頻數(shù)據(jù)的數(shù)據(jù)包;
[0178]解析時(shí)間戳記錄單元904,用于分別記錄每個(gè)數(shù)據(jù)包的解析時(shí)間戳;
[0179]視頻數(shù)據(jù)樣本獲取單元905,用于將起始時(shí)間戳和視頻解析時(shí)間戳綁定視頻數(shù)據(jù)包作為視頻數(shù)據(jù)樣本;
[0180]音頻數(shù)據(jù)樣本獲取單元906,用于將起始時(shí)間戳和音頻解析時(shí)間戳綁定音頻數(shù)據(jù)包作為音頻數(shù)據(jù)樣本;
[0181]音視頻同步播放單元907,用于根據(jù)視頻數(shù)據(jù)樣本和音頻數(shù)據(jù)樣本、以及外部時(shí)鐘同步播放視頻數(shù)據(jù)和音頻數(shù)據(jù)。
[0182]通過起始時(shí)間戳記錄單元記錄流媒體數(shù)據(jù)的起始時(shí)間戳,通過流媒體數(shù)據(jù)解析單元來獲取視頻或音頻數(shù)據(jù)包中的解析時(shí)間戳,由視頻數(shù)據(jù)樣本獲取單元將上述起始時(shí)間戳和視頻解析時(shí)間戳以及視頻數(shù)據(jù)包綁定成為視頻數(shù)據(jù)樣本,由音頻數(shù)據(jù)樣本獲取單元將上述起始時(shí)間戳和音頻解析時(shí)間戳以及音頻數(shù)據(jù)包綁定成為音頻數(shù)據(jù)樣本,之后,再通過音視頻同步播放單元,根據(jù)視頻數(shù)據(jù)樣本和音頻數(shù)據(jù)樣本、以及外部時(shí)鐘同步播放視頻數(shù)據(jù)和音頻數(shù)據(jù)。由此,便完成了視頻和音頻的同步播放過程。
[0183]由以上描述可知,本發(fā)明實(shí)施例提供的技術(shù)方案由于時(shí)間戳不一致而導(dǎo)致的無法較好地實(shí)現(xiàn)音視頻同步播放的技術(shù),本發(fā)明實(shí)施例提供的技術(shù)方案能夠有效實(shí)現(xiàn)音視頻的同步播放。
[0184]具體地,圖10是根據(jù)本發(fā)明實(shí)施例的起始時(shí)間戳記錄單元結(jié)構(gòu)圖,如圖10所示,上述起始時(shí)間戳記錄單元包括:
[0185]流媒體數(shù)據(jù)讀取模塊9021,用于讀取流媒體數(shù)據(jù);[0186]起始時(shí)間戳記錄模塊9022,用于記錄讀取流媒體數(shù)據(jù)中的第一個(gè)視頻數(shù)據(jù)的起始時(shí)間戳。
[0187]圖11是根據(jù)本發(fā)明實(shí)施例的音視頻同步播放裝置的具體結(jié)構(gòu)框圖,如圖11所示,該裝置還包括:
[0188]視頻解碼單元908,用于對(duì)視頻數(shù)據(jù)樣本進(jìn)行解碼得到視頻幀數(shù)據(jù);
[0189]新視頻數(shù)據(jù)樣本獲取單元909,用于將起始時(shí)間戳和視頻解析時(shí)間戳綁定視頻幀數(shù)據(jù)作為新的視頻數(shù)據(jù)樣本。
[0190]圖12是根據(jù)本發(fā)明實(shí)施例的音視頻同步播放裝置的另一個(gè)具體結(jié)構(gòu)框圖,如圖12所示,該裝置還包括:
[0191]音頻解碼單元910,用于對(duì)音頻數(shù)據(jù)樣本進(jìn)行解碼得到音頻幀數(shù)據(jù);
[0192]新音頻數(shù)據(jù)樣本獲取單元911,用于將起始時(shí)間戳和音頻解析時(shí)間戳綁定音頻幀數(shù)據(jù)作為新的音頻數(shù)據(jù)樣本。
[0193]上述音視頻同步播放單元具體用于:根據(jù)新的視頻數(shù)據(jù)樣本和新的音頻數(shù)據(jù)樣本、以及外部時(shí)鐘同步視頻數(shù)據(jù)和音頻數(shù)據(jù)。
[0194]圖13是根據(jù)本發(fā)明實(shí)施例的音視頻同步播放單元的結(jié)構(gòu)框圖,如圖13所示,音視頻同步播放單元包括:
[0195]當(dāng)前視頻幀流時(shí)間獲取模塊9071,用于根據(jù)新的視頻數(shù)據(jù)樣本中的起始時(shí)間戳和視頻解析時(shí)間戳獲取當(dāng)前視頻幀流時(shí)間;
[0196]視頻播放模塊9072,用于當(dāng)當(dāng)前視頻幀流時(shí)間大于外部時(shí)鐘流時(shí)間時(shí),停留預(yù)定時(shí)間后播放當(dāng)前視頻幀,否則,直接播放當(dāng)前視頻幀;
[0197]當(dāng)前音頻幀流時(shí)間獲取模塊9073,用于根據(jù)新的音頻數(shù)據(jù)樣本中的起始時(shí)間戳和音頻解析時(shí)間戳獲取當(dāng)前音頻幀流時(shí)間;
[0198]音頻播放模塊9074,用于當(dāng)當(dāng)前音頻幀流時(shí)間與外部時(shí)鐘流時(shí)間的時(shí)間差大于預(yù)定閾值時(shí),停止播放當(dāng)前音頻幀,否則播放當(dāng)前音頻幀。
[0199]在實(shí)際操作中,該音視頻同步播放裝置可以是上述實(shí)施例一中的播放器。具體地,本發(fā)明實(shí)施例二中所描述的流媒體接收單元901、起始時(shí)間戳記錄單元902、流媒體數(shù)據(jù)解析單元903、解析時(shí)間戳記錄單元904、視頻數(shù)據(jù)樣本獲取單元905、音頻數(shù)據(jù)樣本獲取單元906可以具有上述播放器的分離器的功能;
[0200]視頻解碼單元908、新視頻數(shù)據(jù)樣本獲取單元909可以具有上述播放器的視頻解碼器的功能;
[0201]音頻解碼單元910、新音頻數(shù)據(jù)樣本獲取單元911可以具有上述播放器的音頻解碼器的功能;
[0202]音視頻同步播放單元907中的當(dāng)前視頻幀流時(shí)間獲取模塊9071和視頻播放模塊9072可以具有上述播放器的視頻渲染器的功能;
[0203]當(dāng)前音頻幀流時(shí)間獲取模塊9073和音頻播放模塊9074可以具有上述播放器的音頻渲染器的功能。
[0204]上述各單元的具體執(zhí)行過程可以參見上述實(shí)施例一中的描述,此處不再贅述。
[0205]由上述內(nèi)容可知,運(yùn)用本發(fā)明實(shí)施例提供的音視頻同步播放裝置,可以實(shí)現(xiàn)從影片任何位置開始播放,音視頻都能較好地實(shí)現(xiàn)同步播放。[0206]綜上所述,通過本發(fā)明的音視頻同步播放方法及裝置,可以讓音頻和視頻在播放時(shí),以外部時(shí)鐘為同步源,使得音視頻的起始時(shí)間戳一致,從而克服了現(xiàn)有技術(shù)中無法較好地實(shí)現(xiàn)音視頻同步播放的問題。即使音視頻因碼率或場(chǎng)景復(fù)雜度高產(chǎn)生不可避免的不同步現(xiàn)象,音頻也不會(huì)卡頓,且視頻播放感連續(xù),數(shù)秒內(nèi)可自動(dòng)從不同步恢復(fù)到同步。
[0207]本領(lǐng)域普通技術(shù)人員可以理解實(shí)現(xiàn)上述實(shí)施例方法中的全部或部分步驟可以通過程序來指令相關(guān)的硬件來完成,該程序可以存儲(chǔ)于一計(jì)算機(jī)可讀取存儲(chǔ)介質(zhì)中,比如R0M/RAM、磁碟、光盤等。
[0208]以上所述的具體實(shí)施例,對(duì)本發(fā)明的目的、技術(shù)方案和有益效果進(jìn)行了進(jìn)一步詳細(xì)說明,所應(yīng)理解的是,以上所述僅為本發(fā)明的具體實(shí)施例而已,并不用于限定本發(fā)明的保護(hù)范圍,凡在本發(fā)明的精神和原則之內(nèi),所做的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。
【權(quán)利要求】
1.一種音視頻數(shù)據(jù)的同步播放方法,其特征在于,所述的方法包括: 接收來自系統(tǒng)的包括視頻數(shù)據(jù)和音頻數(shù)據(jù)的流媒體數(shù)據(jù); 讀取所述流媒體數(shù)據(jù)、并記錄讀取所述流媒體數(shù)據(jù)的起始時(shí)間戳; 分別獲取并解析所述視頻數(shù)據(jù)的數(shù)據(jù)包和音頻數(shù)據(jù)的數(shù)據(jù)包; 分別記錄每個(gè)數(shù)據(jù)包的解析時(shí)間戳; 將所述起始時(shí)間戳和視頻解析時(shí)間戳綁定視頻數(shù)據(jù)包作為視頻數(shù)據(jù)樣本; 將所述起始時(shí)間戳和音頻解析時(shí)間戳綁定音頻數(shù)據(jù)包作為音頻數(shù)據(jù)樣本; 根據(jù)所述的視頻數(shù)據(jù)樣本和音頻數(shù)據(jù)樣本、以及外部時(shí)鐘同步播放所述視頻數(shù)據(jù)和音頻數(shù)據(jù)。
2.根據(jù)權(quán)利要求1所述的方法,其特征在于,讀取所述流媒體數(shù)據(jù)并記錄讀取所述流媒體數(shù)據(jù)的起始時(shí)間戳包括: 讀取所述流媒體數(shù)據(jù); 記錄讀取所述流媒體數(shù)據(jù)中的第一個(gè)視頻數(shù)據(jù)的起始時(shí)間戳。
3.根據(jù)權(quán)利要求1所述的方法,其特征在于,將所述起始時(shí)間戳和視頻解析時(shí)間戳綁定視頻數(shù)據(jù)包作為視頻數(shù)據(jù)樣本之后,所述方法還包括: 對(duì)所述視頻數(shù)據(jù)樣本進(jìn)行解碼得到視頻幀數(shù)據(jù); 將所述起始時(shí)間戳和所述視頻解析時(shí)間戳綁定所述視頻幀數(shù)據(jù)作為新的視頻數(shù)據(jù)樣本。
4.根據(jù)權(quán)利要求3所述的方法,其特征在于,將所述起始時(shí)間戳和音頻解析時(shí)間戳綁定音頻數(shù)據(jù)包作為音頻數(shù)據(jù)樣本之后,所述方法還包括: 對(duì)所述音頻數(shù)據(jù)樣本進(jìn)行解碼得到音頻幀數(shù)據(jù); 將所述起始時(shí)間戳和所述音頻解析時(shí)間戳綁定所述音頻幀數(shù)據(jù)作為新的音頻數(shù)據(jù)樣本。
5.根據(jù)權(quán)利要求4所述的方法,其特征在于,根據(jù)所述的視頻數(shù)據(jù)樣本和音頻數(shù)據(jù)樣本、以及外部時(shí)鐘同步播放所述視頻數(shù)據(jù)和音頻數(shù)據(jù)包括: 根據(jù)所述新的視頻數(shù)據(jù)樣本和新的音頻數(shù)據(jù)樣本、以及外部時(shí)鐘同步播放所述視頻數(shù)據(jù)和音頻數(shù)據(jù)。
6.根據(jù)權(quán)利要求5所述的方法,其特征在于,根據(jù)所述新的視頻數(shù)據(jù)樣本和新的音頻數(shù)據(jù)樣本、以及外部時(shí)鐘同步播放所述視頻數(shù)據(jù)和音頻數(shù)據(jù)包括: 根據(jù)所述新的視頻數(shù)據(jù)樣本中的起始時(shí)間戳和視頻解析時(shí)間戳獲取當(dāng)前視頻幀流時(shí)間; 當(dāng)所述當(dāng)前視頻幀流時(shí)間大于所述外部時(shí)鐘流時(shí)間時(shí),停留預(yù)定時(shí)間后播放當(dāng)前視頻幀,否則,直接播放當(dāng)前視頻幀; 根據(jù)所述新的音頻數(shù)據(jù)樣本中的起始時(shí)間戳和音頻解析時(shí)間戳獲取當(dāng)前音頻幀流時(shí)間; 當(dāng)所述當(dāng)前音頻幀流時(shí)間與所述外部時(shí)鐘流時(shí)間的時(shí)間差大于預(yù)定閾值時(shí),停止播放當(dāng)前音頻幀,否則播放當(dāng)前音頻中貞。
7.一種音視頻數(shù)據(jù)的同步播放裝置,其特征在于,所述裝置包括: 流媒體數(shù)據(jù)接收單元,用于接收來自系統(tǒng)的包括視頻數(shù)據(jù)和音頻數(shù)據(jù)的流媒體數(shù)據(jù);起始時(shí)間戳記錄單元,用于讀取所述流媒體數(shù)據(jù)、并記錄讀取所述流媒體數(shù)據(jù)的起始時(shí)間戳; 流媒體數(shù)據(jù)解析單元,用于分別獲取并解析所述視頻數(shù)據(jù)的數(shù)據(jù)包和音頻數(shù)據(jù)的數(shù)據(jù)包; 解析時(shí)間戳記錄單元,用于分別記錄每個(gè)數(shù)據(jù)包的解析時(shí)間戳; 視頻數(shù)據(jù)樣本獲取單元,用于將所述起始時(shí)間戳和視頻解析時(shí)間戳綁定視頻數(shù)據(jù)包作為視頻數(shù)據(jù)樣本; 音頻數(shù)據(jù)樣本獲取單元,用于將所述起始時(shí)間戳和音頻解析時(shí)間戳綁定音頻數(shù)據(jù)包作為音頻數(shù)據(jù)樣本; 音視頻同步播放單元,用于根據(jù)所述的視頻數(shù)據(jù)樣本和音頻數(shù)據(jù)樣本、以及外部時(shí)鐘同步播放所述視頻數(shù)據(jù)和音頻數(shù)據(jù)。
8.根據(jù)權(quán)利要求7所述的裝置,其特征在于,所述起始時(shí)間戳記錄單元包括: 流媒體數(shù)據(jù)讀取模塊,用于讀取所述流媒體數(shù)據(jù); 起始時(shí)間戳記錄模 塊,用于記錄讀取所述流媒體數(shù)據(jù)中的第一個(gè)視頻數(shù)據(jù)的起始時(shí)間戳。
9.根據(jù)權(quán)利要求7所述的裝置,其特征在于,所述裝置還包括: 視頻解碼單元,用于對(duì)所述視頻數(shù)據(jù)樣本進(jìn)行解碼得到視頻幀數(shù)據(jù); 新視頻數(shù)據(jù)樣本獲取單元,用于將所述起始時(shí)間戳和視頻解析時(shí)間戳綁定所述視頻幀數(shù)據(jù)作為新的視頻數(shù)據(jù)樣本。
10.根據(jù)權(quán)利要求9所述的裝置,其特征在于,所述裝置還包括: 音頻解碼單元,用于對(duì)所述音頻數(shù)據(jù)樣本進(jìn)行解碼得到音頻幀數(shù)據(jù); 新音頻數(shù)據(jù)樣本獲取單元,用于將所述起始時(shí)間戳和音頻解析時(shí)間戳綁定所述音頻幀數(shù)據(jù)作為新的音頻數(shù)據(jù)樣本。
11.根據(jù)權(quán)利要求10所述的裝置,其特征在于,所述的音視頻同步播放單元具體用于:根據(jù)所述新的視頻數(shù)據(jù)樣本和新的音頻數(shù)據(jù)樣本、以及外部時(shí)鐘同步所述視頻數(shù)據(jù)和音頻數(shù)據(jù)。
12.根據(jù)權(quán)利要求11所述的裝置,其特征在于,所述的音視頻同步播放單元包括: 當(dāng)前視頻幀流時(shí)間獲取模塊,用于根據(jù)所述新的視頻數(shù)據(jù)樣本中的起始時(shí)間戳和視頻解析時(shí)間戳獲取當(dāng)前視頻幀流時(shí)間; 視頻播放模塊,用于當(dāng)所述當(dāng)前視頻幀流時(shí)間大于所述外部時(shí)鐘流時(shí)間時(shí),停留預(yù)定時(shí)間后播放當(dāng)前視頻幀,否則,直接播放當(dāng)前視頻幀; 當(dāng)前音頻幀流時(shí)間獲取模塊,用于根據(jù)所述新的音頻數(shù)據(jù)樣本中的起始時(shí)間戳和音頻解析時(shí)間戳獲取當(dāng)前音頻幀流時(shí)間; 音頻播放模塊,用于當(dāng)所述當(dāng)前音頻幀流時(shí)間與所述外部時(shí)鐘流時(shí)間的時(shí)間差大于預(yù)定閾值時(shí),停止播放當(dāng)前音頻幀,否則播放所述當(dāng)前音頻幀。
【文檔編號(hào)】H04N21/434GK103686315SQ201210338406
【公開日】2014年3月26日 申請(qǐng)日期:2012年9月13日 優(yōu)先權(quán)日:2012年9月13日
【發(fā)明者】梁健國, 博彬 申請(qǐng)人:深圳市快播科技有限公司