本發(fā)明涉及廣播電視與多媒體的數(shù)字音視頻處理技術領域,特別涉及一種多通道數(shù)字音頻編碼音視頻同步的方法。
背景技術:
在廣電領域,隨著視頻節(jié)目數(shù)量需求的增長以及工業(yè)技術的不斷提升,視頻編碼器輸出視頻節(jié)目數(shù)量隨之遞增,相應的音頻編碼器音頻通道數(shù)也會成比例增長。同時人們對音頻質量的要求正在不斷地提高,從單聲道到立體聲,又在向多聲道發(fā)展,最廣泛采用的多聲道環(huán)繞聲配置是itu-r建議的5.1聲道配置。目前通常采取多通道壓縮編碼技術來解決多路音頻的編碼。如何保證多路音頻被編碼器穩(wěn)定的接收的同時保證音視頻同步,成為音頻編碼關鍵技術之一.
編碼器外部的ad芯片將模擬音頻信號經過脈沖采樣調制(pcm)轉換成串行的數(shù)字音頻信號,再送到編碼器進行編碼。通常地,pcm數(shù)據(jù)由i2s格式傳輸。i2s協(xié)議規(guī)定:由一個串行時鐘sclk,與一個字時鐘lrck指示一個pcm數(shù)據(jù)長度,同時也用于切換左右聲道,以及用二進制補碼表示的串行數(shù)據(jù)sdata組成。其中l(wèi)rck為“1”表示正在傳輸?shù)氖怯衣暤赖臄?shù)據(jù),為“0”則表示正在傳輸?shù)氖亲舐暤赖臄?shù)據(jù)。由于lrck的高低電平對應的sdata代表一個采樣點的其中某一聲道數(shù)據(jù),所以lrck的頻率等于采樣頻率。
音頻pcm數(shù)據(jù)具有的特點包括有:1、pcm幀的長度較長。比如mpeg算法要求一個es幀包含1152個音頻采樣點的編碼數(shù)據(jù),若按雙聲道和16比特位寬的音頻格式計算,pcm幀的長度將達到1152*2*2字節(jié)。2、音頻速率遠低于普通視頻速率。常用的音頻采樣率只有48khz,意味著緩存完一個完整的音頻幀需要較長的時間與存儲資源。如何有效的減少存儲資源,提高數(shù)據(jù)傳輸效率,對音頻編碼器的成本和性能具有很大的影響。
根據(jù)mpeg-1協(xié)議,pts是音頻數(shù)據(jù)存儲單元的顯示時間,即音頻存儲單元第一個有效數(shù)據(jù)的節(jié)目顯示時間。為了保證多路節(jié)目的音視頻同步,需要正確的對每一路音頻產生準確的與視頻同步的pts信息,將此pts信息正確的插入與其一一對應的pes幀頭中。
技術實現(xiàn)要素:
本發(fā)明實施例發(fā)明目的在于提供一種多通道數(shù)字音頻編碼音視頻同步的方法,應用該技術方案可以保證多路音頻編碼的音視頻同步,提高音頻編碼實時性,減小編碼器成本。
為了實現(xiàn)上述發(fā)明目的,本發(fā)明的完整技術方案是:
一種多通道音頻編碼音視頻同步的方法,包括以下步驟:
并行的接收各通道音頻pcm數(shù)據(jù),將各通道音頻pcm數(shù)據(jù)實時寫入ddr;
產生與pcm幀對應的pts值,令pts值分別與pcm幀,es幀,pes幀確定對應關系;
將pts值插入pes幀的幀頭。
優(yōu)選的,并行的接收各通道音頻pcm數(shù)據(jù),將各通道音頻pcm數(shù)據(jù)實時寫入ddr,具體為:在各通道的輸入端乒乓緩存短長度的音頻pcm數(shù)據(jù),將短長度的音頻pcm數(shù)據(jù)以burst方式寫入ddr。
優(yōu)選的,產生與pcm幀對應的pts值,令pts值分別與pcm幀,es幀,pes幀確定對應關系,具體為:當?shù)趇(1~n)通道的pcm幀的第一個數(shù)據(jù)從輸入端輸入時,將實時產生的pts值寫入第i(1~n)通道對應的pts寄存器;寫入第i(1~n)通道對應的pts寄存器的pts值與第i(1~n)通道的pcm幀具有對應關系;pts值表示該pcm幀第一個數(shù)據(jù)的顯示時間戳。
優(yōu)選的,接收視頻編碼器中的pcr包,提取出pcr值,pcr值包含pcr_base值與pcr_ext值;本地pts計數(shù)器對27mhz時鐘進行計數(shù),本地pts計數(shù)器分為pts_base計數(shù)器與pts_ext計數(shù)器;pts_ext計數(shù)器計數(shù)范圍為0到299,當pts_ext計數(shù)300個27mhz時鐘周期后,將pts_ext計數(shù)器歸零,并且將pts_base計數(shù)器的數(shù)值加1;pts_base計數(shù)器與pts_ext計數(shù)器的初始值為第一次提取的pcr_base值與pcr_ext值;當獲取到pcr_base值,計算pcr_base值與本地pts_base計數(shù)器數(shù)值的差值dif_pts;若dif_pts小于預設閾值,則本地pts_base計數(shù)器和pts_ext計數(shù)器的數(shù)值不進行校正,并將pts_base值作為實時的與視頻同步的pts值;若dif_pts大于預設閾值,校正本地pts_base計數(shù)器和pts_ext計數(shù)器的數(shù)值。
優(yōu)選的,其中若dif_pts大于預設閾值,校正本地pts_base計數(shù)器和pts_ext計數(shù)器的數(shù)值;具體為:若dif_pts大于預設閾值,將pts_base計數(shù)器數(shù)值重置為dif_pts的二分之一與pts_base計數(shù)器數(shù)值的和;采用correct_cnt計數(shù)器對dif_pts大于預設閾值的次數(shù)進行計數(shù);若dif_pts大于預設閾值則correct_cnt計數(shù)加1;若correct_cnt達到預設最大值,則將pts_base計數(shù)器和pts_ext計數(shù)器分別重置為pcr_base值和pcr_ext值。
優(yōu)選的,當dif_pts大于預設閾值或者correct_cnt小于預設最大值,則correct_cnt清零。
優(yōu)選的,在第i(1~n)通道的pcm幀的第一個數(shù)據(jù)從輸入端輸入時,將實時產生的pts值寫入第i(1~n)通道對應的pts寄存器;寫入第i(1~n)通道對應的pts寄存器的pts值與第i(1~n)通道的pcm幀具有對應關系;具體為:在第i(1~n)通道的pcm幀的數(shù)據(jù)輸入端,用pcm_counter計數(shù)器對輸入的pcm數(shù)據(jù)個數(shù)進行計數(shù),當計數(shù)滿一個pcm幀長度,產生pts請求信號,鎖存實時的與視頻同步的pts信息;所述pts信息與下一個pcm幀對應,其pts值表示下一個pcm幀的第一個數(shù)據(jù)的顯示時間戳。
優(yōu)選的,將pcm幀進行編碼轉化成es幀,pts值與pcm幀的對應關系轉化為pts值與es幀的對應關系;es幀組成pes幀,pts值與es幀的對應關系轉換為pts值與pes幀的對應關系。
優(yōu)選的,將pcm幀進行編碼轉化成es幀,pts值與pcm幀的對應關系轉化為pts值與es幀的對應關系;具體為:同時讀出緩存在ddr內的第i(1~n)通道的pcm幀以及pts寄存器內的與該pcm幀對應的pts值。將pts值存入通道i(1~n)的fifo中;對第i(1~n)通道的pcm幀經過編碼產生es幀,向第通道i(1~n)的fifo取出一次pts值,此pts值與es幀具有對應關系,pts值表示es第一個有效音頻數(shù)據(jù)對應的顯示時間戳。
優(yōu)選的,pts值與es幀的對應關系轉換為pts值與pes幀的對應關系;具體為:將與第通道i(1~n)的pes幀封裝的第一個es幀對應的pts值作為與通道i(1~n)的pes幀對應的pts值,并將此pts值插入通道i(1~n)中的pes幀的幀頭。
由上可見,應用本實施例技術方案,多路音頻通道同時并行接收數(shù)據(jù),實時的產生與視頻同步的pts信息,并行的將pts信息植入pes幀頭里。在音頻數(shù)據(jù)編碼的過程中,音頻數(shù)據(jù)格式從pcm幀經過運算編碼成es幀,es再組合成pes幀。本發(fā)明始終保持著pts與各種音頻幀的對應關系,直到pts值正確的插入pes幀的幀頭,所以具有極好的音視頻同步指標,音頻編碼的實時性較強。
針對音頻幀長度較長,音頻數(shù)據(jù)速率較小的特點。編碼器外部ddr存儲完整的音頻幀,編碼器片內的輸入緩沖器只緩存一個極小的ddr讀寫brust長度的數(shù)據(jù),而并非緩存完整的音頻幀。這樣各路音頻幾乎同時地在向ddr存入數(shù)據(jù)。在保證了多路音頻輸入的實時性,減小了音頻信號通過編碼器的延時。同時節(jié)省了片內的存儲器資源。
可以動態(tài)調整輸入音頻幀的長度,以適應各種編碼算法的要求,如mpeg算法要求一個es幀包含1152個采樣點的編碼數(shù)據(jù),而dra算法要求1024個采樣點作為原始幀輸入。本發(fā)明只要重新分配ddr內pcm幀的存儲空間大小即可完成各種編碼算法的無縫切換。
附圖說明
為了更清楚地說明本發(fā)明實施例或現(xiàn)有技術中的技術方案,下面將對實施例或現(xiàn)有技術描述中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖僅僅是本發(fā)明的一些實施例,對于本領域普通技術人員來講,在不付出創(chuàng)造性勞動性的前提下,還可以根據(jù)這些附圖獲得其他的附圖。
圖1為本發(fā)明實施例提供的系統(tǒng)結構框圖;
圖2為本發(fā)明實施例提供的與圖1對應的內部裝置結構圖;
圖3為本發(fā)明實施例提供的pts_gen模的內部結構框圖;
圖4為本發(fā)明實施例提供的編碼后音頻幀封裝的數(shù)據(jù)結構圖;
圖5為本發(fā)明實施例提供的本地pts計數(shù)逼近的流程圖。
具體實施方式
下面將結合本發(fā)明實施例中的附圖,對本發(fā)明實施例中的技術方案進行清楚、完整地描述,顯然,所描述的實施例僅僅是本發(fā)明一部分實施例,而不是全部的實施例。基于本發(fā)明中的實施例,本領域普通技術人員在沒有作出創(chuàng)造性勞動前提下所獲得的所有其他實施例,都屬于本發(fā)明保護的范圍。
實施例1:
如圖1所示,本實施例提供的編碼器包括如多路音頻pcm數(shù)據(jù)接收部分、pts生成部分、編碼輸出部分。并且根據(jù)圖1提供一種多通道音頻編碼音視頻同步的方法,步驟包括:
并行的接收各通道音頻pcm數(shù)據(jù),將各通道音頻pcm數(shù)據(jù)實時寫入ddr;
產生與pcm幀對應的pts值,令pts值分別與pcm幀,es幀,pes幀確定對應關系;
將pts值插入pes幀的幀頭。
具體的,結合圖2所示,圖中partⅰ部分為多路音頻pcm數(shù)據(jù)接收部分,其功能是實現(xiàn)多路音頻pcm數(shù)據(jù)的并行接收。圖中所示對于第1個通道到第n個通道在mux模塊(4)之前具有相同的處理過程。這里以第一個通道channel_1進行詳解。
串并轉換模塊(1)完成串行的pcm數(shù)據(jù)轉成并行數(shù)據(jù)的功能。為了使本發(fā)明的目的、技術方案及優(yōu)點更加清楚明白,本實例采用的是i2s接口的pcm數(shù)據(jù),應當理解對于其他接口的數(shù)字音頻,本發(fā)明仍然適用,請參考權利說明。
串并轉換模塊(1)采用移位寄存器實現(xiàn)。串行數(shù)據(jù)sdata根據(jù)sclk和lrclk的變化沿移入移位寄存器。具體如下:計數(shù)器counter_bit的值表示已經移入移位寄存器的位數(shù)。counter_bit在字時鐘lrck變化沿清零,每當檢測到sclk的上升沿將串行數(shù)據(jù)sdata移入移位寄存器,同時counter_bit計數(shù)加1。設輸入pcm數(shù)據(jù)位寬為m比特,則當counter_bit計數(shù)到m,將移位寄存器數(shù)據(jù)并行輸出。
乘法器(2)用于將pcm數(shù)據(jù)放大。通過乘數(shù)因子m調節(jié)提高音量幅度。采用32位有符號乘法運算。在乘法運算后,根據(jù)音頻編碼算法要求對pcm數(shù)據(jù)位寬進行調整。若音頻編碼算法要求的數(shù)據(jù)位寬小于32,則保留高位省略低位。
復用器(4)用于將從channel_1到channel_n并行輸入的多通道pcm音頻數(shù)據(jù)復用成一路數(shù)據(jù)通過ddr總線寫入ddr。
buffer(3)作為復用器(4)的緩沖器,buffer(3)采用乒乓操作的方式,當buffer(3)的乒區(qū)或乓區(qū)存滿一個burst長度的數(shù)據(jù),將數(shù)據(jù)以burst的方式將乒區(qū)或乓區(qū)數(shù)據(jù)連續(xù)地寫入ddr。
ddr(5)顯示了pcm數(shù)據(jù)在ddr內部的存儲結構。
ddr根據(jù)通道數(shù)目n劃分為n個區(qū)間,稱之為通道區(qū)間,用于存放各通道的pcm數(shù)據(jù)。每個通道區(qū)間采用乒乓操作的方式進行讀寫。因此每個通道區(qū)間分為大小相等的兩個子區(qū)間乒區(qū)a和乓區(qū)b。乒區(qū)a和乓區(qū)b各存儲一個pcm幀。pcm幀的長度由音頻編碼算法規(guī)定。設某編碼算法要求es幀包含的采樣點數(shù)目為x,音頻聲道數(shù)目為y,pcm數(shù)據(jù)位寬為z字節(jié),則一個pcm幀的長度為x*y*z字節(jié),比如mpeg-1音頻編碼,一個es對應1152個pcm采樣點,設一個采樣包含兩個聲道,pcm數(shù)據(jù)位寬2字節(jié),這樣一個pcm幀的長度為1152*2*2字節(jié).
ddr讀寫時序如圖2的(6)所示的pingpong操作:
寫操作:當某通道i(channel_1~channel_n)的buffer(3)存滿一個burst長度的數(shù)據(jù)后,將burst長度的數(shù)據(jù)連續(xù)寫入ddr。若檢測到該通道i上次burst寫操作未將子區(qū)間寫滿,則當前burst數(shù)據(jù)的ddr起始地址為圖2(5)ddr所示的通道所在子區(qū)間的與上次burst數(shù)據(jù)地址順序相鄰的地址。若檢測到該通道i上次burst寫操作已寫滿一個子區(qū)間(子區(qū)間a或b),則當前burst數(shù)據(jù)的ddr起始地址為乒乓操作的另一個子區(qū)間(子區(qū)間b或a)的起始地址。讀操作:寫滿通道區(qū)間的一個子區(qū)間后,將子區(qū)間數(shù)據(jù)連續(xù)讀出。
如圖2所示,partⅱ為pts生成部分,由pts_gen模塊(7)與pts寄存器(8)組成。其功能為產生與pcm幀對應的pts值,也叫pts時間戳,并存入相應的pts寄存器。
如圖3所示,pts_gen模塊由pcr_analysis模塊(21)、pts_counter模塊(22)、pts_trans_ctrl(23)、與pcm_counter(24)組成。由pcr_analysis模塊(21),pts_counter模塊(22)組合產生實時的與視頻同步的pts信息;pts_trans_ctrl模塊(23),與pcm_counter模塊(24)組合將實時的pts信息寫入各通道對應的pts寄存器。
產生實時的與視頻同步的pts信息采用本地pts計數(shù)逼近的方法,具體如圖5所示,包括:
步驟100:pcr_analysis(21)對視頻編碼器傳來的pcr信息進行解析,提取出pcr_base值與pcr_ext值。這里的pcr信息包含了pcr_base值和pcr_ext值。
步驟101:pts_counter(22)模塊用于產生實時的pts值,后續(xù)模塊pts_trans_ctrl模塊(23)鎖存該pts值作為與pcm幀對應的pts時間戳。pts_counter(22)模塊包含pts_base計數(shù)器與pts_ext計數(shù)器,其中pts_ext計數(shù)器對本地27mhz時鐘計數(shù),計數(shù)區(qū)間0到299。當pts_ext計數(shù)器的計數(shù)值滿300個27mhz時鐘周期pts_base計數(shù)器的數(shù)值加1。
pts_base計數(shù)器和pts_ext計數(shù)器的啟動初始值分別為為第一次從pcr_analysis(21)s模塊獲取的pcr_base值與pcr_ext值。
步驟102:當pcr_analysis(21)獲取到新的視頻pcr_base值時,計算pcr_base值與pts_base計數(shù)器的數(shù)值的差,差用dif_pts表示,即dif_pts=pcr_base-pts_base,將dif_pts與預設閥值進行比較。
步驟103:若dif_pts小于預設閥值,則pts_base計數(shù)器數(shù)值與pts_ext計數(shù)器數(shù)值不進行校正,將pts_base計數(shù)器數(shù)值作為實時的與視頻同步的pts信息。
步驟104:若dif_pts大于預設閥值,統(tǒng)計dif_pts超過預設閥值的次數(shù)的計數(shù)器加1。dif_pts采用了correct_cnt計數(shù)器計數(shù)dif_pts超過預設閥值的次數(shù)。correct_cnt計數(shù)器的邏輯行為如下:
當pcr_analysis(21)獲取到新的視頻pcr_base值時,計算出dif_pts小于預設閥值或者correct_cnt計數(shù)器數(shù)值已經計數(shù)到預設最大值,則correct_cnt計數(shù)器數(shù)值清零,若dif_pts大于預設閥值且correct_cnt小于預設最大值,則correct_cnt計數(shù)器數(shù)值加1。
步驟105:當pcr_analysis(21)獲取到新的視頻pcr_base值時,判斷correct_cnt是否達到預設最大值。
步驟106:當pcr_analysis(21)獲取到新的視頻pcr_base值時,若dif_pts大于預設閥值,且correct_cnt計數(shù)器數(shù)值未達到預設最大值,將pts_base計數(shù)器數(shù)值重置為dif_pts的二分之一與pts_base計數(shù)器數(shù)值的和。
步驟107:若correct_cnt計數(shù)器數(shù)值達到預設最大值,則將本地pts_base計數(shù)器與pts_ext計數(shù)器數(shù)值分別置為pcr_base值與pcr_ext值。
如圖3所示,每個輸入通道對應的pcm_counter模塊(24)用于在計數(shù)滿pcm幀長度后產生請求脈沖,使得pts_trans_ctrl模塊(23)鎖存pts_counter(22)輸出的實時pts信息作為i(channel_1~channel_n)通道的pcm幀對應的pts信息。根據(jù)pcm數(shù)據(jù)性質,pcm數(shù)據(jù)在數(shù)據(jù)通道一直為有效數(shù)據(jù),因此,所述pts信息與下一個pcm幀對應,。
pcm_counter模塊(24)對各通道的輸入pcm數(shù)據(jù)個數(shù)進行計數(shù)。由于pcm字同步信號與單個pcm數(shù)據(jù)同步,所以每當檢測到pcm字同步信號則pcm_counter模塊計數(shù)加一。應當注意本實例使用的pcm格式為i2s格式。字同步信號即為字時鐘lrclk,其他形式的pcm字同步信號本實例仍然使用,應在本實例權利范圍內。
當?shù)趇(channel_1~channel_n)通道的pcm_counter(24)計數(shù)滿一個pcm幀長度后,計數(shù)器歸零,并產生請求脈沖。
當pts_trans_ctrl(23)檢測到來自于第i通道(channel_1~channel_n)的pcm_counter(24)的請求脈沖,則將鎖存的來自于pts_counter(22)的pts_base值并寫入圖2所示的pts寄存器(8)屬于第i通道的pts寄存器內。
若pts_trans_ctrl(23)同時檢測到多個通道的pcm_counter(24)產生的請求脈沖則將鎖存的來自于pts_counter(22)的pts_base值寫入圖2所示的pts寄存器(8)內的相應的多個通道的pts寄存器。
下面詳述pts_trans_ctrl(23)寫入pts寄存器(8)的位置。
如圖2所示,pts寄存器(8)每個通道分配兩個寄存器,稱之為寄存器a與寄存器b。寄存器a與寄存器b存儲的pts值對應ddr(7)子區(qū)間a和b內pcm幀。對應關系如圖2中(9)所示。
第i通道(channel_1~channel_n)的寄存器a與寄存器b寫入采取乒乓操作的方式。按照mpeg協(xié)議,pts值為存儲單元第一個數(shù)據(jù)的顯示時間戳。在本方案里,pcm數(shù)據(jù)的存儲單元就是pcm幀,所以pts值為pcm幀一個數(shù)據(jù)的顯示時間。因此設前一次寫入第i通道(channel_1~channel_n)的寄存器a,則當圖3的pts_trans_ctrl(23)檢測到第i通道(channel_1~channel_n)的pcm_counter(24)請求脈沖時,pts_trans_ctrl(23)將pts值寫入第i通道(channel_1~channel_n)的寄存器b;反之,設前一次寫入第i通道(channel_1~channel_n)的寄存器b,則當圖3的pts_trans_ctrl(23)檢測到第i通道(channel_1~channel_n)的pcm_counter(24)請求脈沖時,pts_trans_ctrl(23)將pts值寫入第i通道(channel_1~channel_n)的寄存器a,如此交替。
如圖2,partⅲ為編碼輸出部分完成各種格式音頻幀的封裝,將pts值插入pes幀頭中。
圖中(9)所示pcm幀與pts具有一一對應關系,即pts值為pcm幀第一個pcm數(shù)據(jù)對應的節(jié)目顯示時間戳。在后續(xù)處理中,一個pcm幀經過編碼轉換成一個es幀,則相同的pts值表示該es幀起始的節(jié)目顯示時間戳。所以需要在編碼算法模塊encoder_ari(11)前后都要保持這樣的對應關系。如圖4,通道i的音頻幀封裝示意圖,編碼前,pts_1(45)對應于pcm_frame_1(43);則在編碼之后,同樣的pts_1值(45)對應于編碼之后的es_frame_1幀(44)。具體做法下:
將ddr內第通道i(channel_1~channel_n)pcm幀讀出到i通道的encoderbuffer(10)進行緩存。同時將與該pcm幀對應的pts值從pts寄存器取出到pes封裝模塊(13)。
pes封裝模塊(13)針對每個音頻通道有指定存放pts值的fifo。編碼算法模塊encoder_ari(11)讀取encode_buffer里的pcm幀進行編碼,編碼后此pcm幀轉換為es幀。es幀產生后經過esbuffer(12)輸出到pes封裝模塊(13)。當pes封裝模塊接收到第i(channel_1~channel_n)通道的es幀,則從第i通道fifo取出一個pts值作為與此es幀對應的pts值。將此pts值與es值捆綁起來做后續(xù)處理。這樣地,編碼后pts值與es幀的對應關系與編碼前pts值與pcm幀的對應關系保持一致。
編碼算法模塊encoder_ari(11)可采用各種音頻編碼算法,不在權利的申述范圍內。
如圖4所示,為第i(channel_1~channel_n)通道編碼音頻幀的封裝過程。pes封裝模塊完成音頻數(shù)據(jù)es幀到pes幀的格式轉換,并將實時的與視頻同步的pts值插入pes幀頭內。pes包可根據(jù)需要封裝任意數(shù)量的es包。如圖4所示,設一個pes幀封裝n個es幀,則將pes幀封裝的第一個es幀es_frame_1(44)對應的pts值pts_1(45)作為pes幀的pts值,該pts值為pes幀的第一個es起始的顯示時間,也是pes的顯示時間,將該pts值插入pes包頭中。其余es幀對應的pts值從fifo讀出后丟棄如圖4(46)discard所示。
如圖2,ts封裝模塊(13)按照協(xié)議要求將pes幀分解后插入ts幀的負載payload(如圖4)區(qū)域中,并將各通道生成的ts復用成一路ts。
以上所述的實施方式,并不構成對該技術方案保護范圍的限定。任何在上述實施方式的精神和原則之內所作的修改、等同替換和改進等,均應包含在該技術方案的保護范圍之內。