一、引言
MPEG-2系統用于視音頻同步以及系統時鐘恢複的時間标簽分别在ES,PES和TS這3個層次中。在ES層,與同步有關的主要是視訊緩沖驗證VBV(Video Buffer Verifier),用以防止解碼器的緩沖器出現上溢或者下溢;在PES層,主要是在PES頭資訊裡出現的顯示時間标簽PTS(Presentation Time Stamp)和解碼時間标簽DTS(Decoding Time Stamp);在TS層中,TS頭資訊包含了節目時鐘參考PCR(Program Clock Reference),用于恢複出與編碼端一緻的系統時序時鐘STC(System Time Clock)。在節目流PS標頭中加入SCR,它的作用與PCR域相似。标準規定在原始音頻和視訊流中,PTS的間隔不能超過0.7s,而出現在TS標頭的PCR間隔不能超過0.1s。
我們知道,MPEG-2對視訊的壓縮産生I幀、P幀、B幀。把幀順序I1幀-P4幀-B2幀-B3幀-P7幀-B5幀-B6幀的編碼ES,通過打包并在每個幀中插入PTS/DTS标志,變成PES。在插入PTS/DTS标志時,由于在B幀PTS和DTS是相等的,是以無須在B幀多插入DTS(參見圖1)。而對于I幀和P幀,由于經過複用後資料包的順序會發生變化,顯示前一定要存儲于視訊解碼器的從新排序緩存器中,經過從新排序後再顯示,是以一定要同時插入PTS和DTS作為從新排序的依據。
二、同步機制
編碼器中有一個系統時鐘STC(其頻率是27MHz),此時鐘用來産生訓示音視訊的正确顯示和解碼的時間标簽,同時可用來訓示在采樣過程中系統時鐘本身的瞬時值。訓示音視訊顯示時間的時間标簽稱為顯示時間标簽(PTS),訓示音視訊的解碼時間标簽稱為解碼時間标簽(DTS),訓示系統時鐘本身的瞬時值的時間标簽稱為節目參考時鐘标簽(PCR)。解碼器通過VBV_delay(視訊流延時值,在解碼時利用視訊流緩沖區把視訊流緩存到相應的vbv_delay時間後,再啟動解碼器解碼、顯示、實作音視訊的同步。vbv_delay存在于視訊ES的頭部,長度為16bit)的數值來确定解碼的開始,用解碼時間标簽(DTS)和顯示時間标簽(PTS)來确定解碼和顯示的次序,用PCR來獲得系統時鐘的同步。解碼器中的系統時鐘及其同步就是依靠這些時間标簽來進行恢複和修正的。
PCR的插入必須在PCR字段的最後離開複用器的那一時刻,同時把27MHz系統時鐘的采樣瞬時值作為PCR字段插入到相應的PCR域。是放在TS標頭的自适應區中傳送。27 MHz時鐘經波形整理後分兩路,一路是由27MHz脈沖直接觸發計數器生成擴充域PCR_ext,長度為9bits。另一路經一個300分頻器後的90 kHz脈沖送入一個33位計數器生成90KHZ基值,列入PCR_base(基值域),長度33bits,用于和PTS/DTS比較,産生解碼和顯示所需要的同步信号。這兩部分被置入PCR域,共同組成了42位的PCR。
PTS域為33bits,它也是一個33b的計數值,也是對系統時鐘的300分頻的時鐘的計數值。被編碼成為3個獨立的字段,表示此分組中第一個通路單元在系統目标解碼器中的預定顯示時間。
DTS域也為33bits,編碼成為3個獨立的字段,表示此分組中第一個通路單元在系統目标解碼器中的預定解碼時間。DTS就視訊來說,因為視訊編碼的時候用到了雙向預測,一個圖像單元被解出,并非馬上就被顯示,可能在存儲器中留一段時間,作為其餘圖像單元的解碼參考,在被參考完畢後,才被顯示。針對視訊的顯示,Mpeg還提出了一個視訊PTS。針對音頻和視訊的同步顯示,又提出了一個音頻PTS。由于聲音沒有用到雙向預測,它的解碼次序就是它的顯示次序,故對它隻提出PTS的概念。
解碼器在解碼時,首先利用PCR重建和編碼器同步的27 MHz系統時鐘,恢複27 MHz系統時鐘後,再利用PES流中的DTS,PTS進行音頻與視訊間的同步,同時利用VBV_Delay設定解碼器的緩沖時長,後啟動初始解碼。下圖是利用PCR恢複STC的原理圖。
圖2 用PCR恢複本地STC時鐘
PCR-Base的作用是在解碼器切換節目時,提供對解碼器PCR計數器的初始值,以讓該PCR值與PTS、DTS最大可能地達到相同的時間起點。PCR-ext的作用是通過解碼器端的鎖相環電路修正解碼器的系統時鐘,使其達到和編碼器一緻的27MHz。
在PCR域的33 bits中的90 kHz部分(即PCR-Base域)用于與PTS和DTS作比較,當二者相同時,相應的單元被顯示或者解碼。但按照MPEG-2标準的規定,PTS/DTS位于PES包的標頭中,而解複用器所解出的PES標頭的位元組不被送入到任何基本流解碼器的輸入緩沖區,僅用于控制各解碼器工作。每當解複用器解到一個PTS/DTS時,PTS/DTS就作為其後送入各個基本流解碼器的輸入緩沖器中的資料的顯示/解碼時間,但此時送入信道緩沖器中的基本流并不一定立即被解碼,是以基本流解碼器必須記錄目前這個PTS/DTS及所對應的碼流位置,以利于後面的解碼和顯示同步。
針對以上分析,我們采用如下方法來達到解碼與顯示的同步:在每一個基本流解碼器中建立一個33 bits的PTS/DTS先入先出存儲器(FIFO),用以存放PTS/DTS值,同時在解複用器中加入一個檢測電路,每當碼流開始新的一幀圖像時,則産生一個信号,用來通知基本流解碼器,并将該幀圖像的PTS/DTS寫入到FIFO中。每當解碼器解到一幀圖像時,就從FIFO中讀出相應的PTS/DTS,此PTS/DTS與STC進行比較,當兩者相等時,目前圖像就開始顯示/解碼。
在MPEG-2标準中,并非每一個PES包或每一幀圖像均有PTS和DTS,一般PS流中每兩個PTS之間的間隔是0.7 s,而TS流中每兩個PTS之間的間隔是0.1 s,是以在沒有PTS和DTS的一幀圖像出現時,我們可以在前一PTS/DTS的基礎上加一增量得到對應該幀圖像的PTS/DTS,并将計算出來的新的PTS/DTS插入到存放PTS/DTS的FIFO中去,即:PTSn=PTSn-1+ΔPTS(n為第n幀圖像)。
解碼器同步算法總結如下:
(1)解碼器從輸入碼流的標頭中解出時間資訊PCR送入到系統時間時鐘恢複電路;系統時間時鐘恢複電路在接收到每一個新的PCR時,進行本地系統時間時鐘恢複和鎖相。
(2)解複用器後,從PES標頭中解出顯示時間标簽PTS和解碼時間标簽DTS,并送入到基本流解碼器中。
(3)基本流解碼器在接收到新的PTS/DTS後,存入對應的FIFO(先進先處存儲器)中進行管理;對于沒有PTS/DTS的顯示單元,需要對其時間标簽進行插值,并送入到FIFO中管理。
(4)每一顯示單元開始解碼前,用其對應的DTS與STC進行比較,當STC與DTS相等時開始解碼;
(5)每一顯示單元開始顯示前,用其對應的PTS與STC進行比較,當STC與PTS相等時開始顯示。
三、失同步處理
27 MHz系統時鐘經過300分頻後,得到本地的33 bits PCR_Base,該時鐘與寄存器中目前圖像的PTS/DTS進行比較,系統軟體根據比較結果做出相應的處理: