在MPEG-2標(biāo)準(zhǔn)中,有兩種不同類型的碼流輸出到信道:一種是節(jié)目碼流(Program Stream, PS),適用于沒(méi)有誤差產(chǎn)生的媒體存儲(chǔ),如DVD等存儲(chǔ)介質(zhì);另一種是傳送流(Transport stream, TS),適用于有信道噪聲產(chǎn)生的傳輸,目前TS流廣泛應(yīng)用于廣播電視中,如機(jī)頂盒等。
ES流(Elementary Stream):基本碼流,可以理解為編碼后的裸數(shù)據(jù);
PES流:分割打包的ES流,加入了PES頭。PES包是可變長(zhǎng)度的,PES頭中最重要的部分是顯示時(shí)間標(biāo)記(Presentation Time Stamp, PTS)和解碼時(shí)間標(biāo)記(Decode Time Stamp, DTS),有了PTS和DTS,再加上節(jié)目時(shí)鐘參考PCR,解碼器就能從TS流中重建視頻流;
TS流(Transport Stream):傳輸流。固定包長(zhǎng)度為188B,TS流固定包長(zhǎng)度的好處是便于找到幀的起始位置,易于從包丟失中恢復(fù),適合于有誤碼的環(huán)境。
TS header是4byte,分別是1byte的同步字節(jié),1bit傳輸數(shù)據(jù)包差錯(cuò)指示, 1bit凈荷單元起始指示, 1bit傳送優(yōu)先權(quán), 13bit包標(biāo)識(shí)符PID, 2bit傳送加擾控制,2bit調(diào)整字段控制和4bit連續(xù)計(jì)數(shù)器。
同步字節(jié)(sync byte): 1B,其值固定為0x47,該字段是MPEG-2 TS傳送包標(biāo)識(shí)符;
傳輸誤差指示符(transport error indicator): 1bit,其值為1時(shí),表示在相關(guān)的傳送包中至少有一個(gè)不可糾正的錯(cuò)誤位,只有在錯(cuò)誤糾正之后,該位才能被重新置0;
有效載荷單元起始符(payload unit start indicator): 1bit, 當(dāng)TS包帶有PES包數(shù)據(jù)時(shí),置為1,表示TS包的有效凈荷以PES包的第一個(gè)字節(jié)開(kāi)始;置為0,表示該TS包的開(kāi)始不是PES包;當(dāng)TS包帶有PSI數(shù)據(jù)時(shí),置為1,表示TS包帶有PSI部分的第一個(gè)字節(jié),即第一個(gè)字節(jié)帶有指針pointer_field;置為0,表示TS包不帶有一個(gè)PSI部分的第一個(gè)字節(jié),即有效凈荷中沒(méi)有指針pointer_field。空包時(shí),該位置為0;
傳輸優(yōu)先級(jí)(transport_prority): 1bit, 置為1,表示相關(guān)的包比其他具有相同PID,但是此字段置0的包有更高的優(yōu)先級(jí);
PID: 13bit, 表示傳送包的有效凈荷中的數(shù)據(jù)的類型。具體如下表:
PID取值 | PID值使用描述 |
0x0000 | 節(jié)目關(guān)聯(lián)表(program association table, PAT) |
0x0001 | 條件訪問(wèn)表(conditional access table, CAT) |
0x0002 | 傳送流描述表(transport stream description table, TSDT) |
0x0003~0x000F | 保留 |
0x0010~0x1FFE | 可以分配為network PID, Program map PID, elementary PID, 或其它 |
0x1FFF | 空包(8191) |
PID信息非常關(guān)鍵,它直接表征本次TS包的用途。比較重要的是PAT和PMT,之后會(huì)有說(shuō)明;
傳輸加擾控制(transport scrambling control): 2bit,該字段用來(lái)指示傳送流包有效凈荷的加擾方式;
自適應(yīng)字段控制(adaption field control): 2bit,表示傳送流包首部是否跟隨有調(diào)整字段和/或有效凈荷。具體如下表:
調(diào)整字段值 | 描述 |
00 | 保留 |
01 | 沒(méi)有調(diào)整字段,僅含有184B長(zhǎng)度的有效凈荷 |
10 | 沒(méi)有有效凈荷,僅含有183B長(zhǎng)度的調(diào)整字段 |
11 | 0~182B的調(diào)整字段后為有效凈荷 |
連續(xù)計(jì)數(shù)器(continuity counter): 4bit,隨著具有相同PID TS包的增加而增加,達(dá)到最大則恢復(fù)為0.
在MPEG-2 TS中,為了傳送打包后長(zhǎng)度不足188B的不完整TS,或者為了在系統(tǒng)層插入節(jié)目時(shí)鐘參考(program clock reference, PCR),需要在TS包中插入可邊長(zhǎng)字節(jié)的調(diào)整字段。調(diào)整字段其中一個(gè)重要作用是解決編解碼器的音視頻同步問(wèn)題。一般在視頻幀中的TS包的調(diào)整字段中,每隔一定傳輸時(shí)間,傳送系統(tǒng)時(shí)鐘27MHz的一個(gè)抽樣值給接收機(jī),作為解碼器解碼時(shí)的時(shí)鐘參考信息PCR。PCR通常每隔100ms至少被傳輸一次。PCR的數(shù)值所表示的是解碼器在讀完這個(gè)抽樣值的最后那個(gè)字節(jié)時(shí),解碼器本地時(shí)鐘所應(yīng)處的狀態(tài)。通常情況下,PCR不直接改變解碼器的本地時(shí)鐘,而是作為參考基準(zhǔn)來(lái)調(diào)整本地時(shí)鐘,使之與PCR趨于一致。
PES包的第5個(gè)字節(jié)標(biāo)識(shí)一整個(gè)PES包的長(zhǎng)度,一般來(lái)說(shuō),一個(gè)PES包包含一幀圖像,獲取了PES的包長(zhǎng)度Len,當(dāng)接收到Len個(gè)字節(jié)后,將接收到的字節(jié)組成一個(gè)block,放入FIFO中,等待解碼線程解碼。DTS和PTS也在PES包中傳送。
前邊提到了PAT和PMT,它們都是PSI之一。MPEG-2 TS傳送TS包,這些包攜帶兩類信息:已壓縮的音視頻(PES)和與之相關(guān)的符號(hào)化表(PSI),由傳送包的PID來(lái)識(shí)別。
PAT定義了TS中的所有節(jié)目,其值為0x0000,是PSI信息的根結(jié)點(diǎn)。其格式如下圖。
上圖中,程序在解析到N環(huán)部分的時(shí)候,會(huì)讀取并保存節(jié)目列表及其PID。PAT信息在TS流中隔一段時(shí)間就會(huì)傳送,接收機(jī)在接收時(shí),以接收PAT表為起始。PAT表列出了TS流中所有的節(jié)目列表,以及節(jié)目對(duì)應(yīng)的PID值,這個(gè)PID值表征的是該節(jié)目對(duì)應(yīng)的PMT表的PID值(PMT表稍后說(shuō)明)。PAT表與PMT的關(guān)系如下圖。
PMT提供一路節(jié)目包含的所有原始碼流的PID映射表,其格式如下圖。
程序在讀取N環(huán)的時(shí)候會(huì)讀取該節(jié)目所有的碼流列表及其PID,解析的時(shí)候可以根據(jù)PID來(lái)分離。這N環(huán)描述符包括的信息如下圖所示。節(jié)目時(shí)鐘參考PCR的PID和視頻的PID是相等的。由PAT得出所有的節(jié)目列表,選定收看的節(jié)目后,篩選出等于該節(jié)目PID的TS包,就可以得到該節(jié)目的所有碼流的PID映射表,這樣接收機(jī)就可以只接收PID等于該節(jié)目的碼流的TS包即可收看該節(jié)目。
前邊介紹的是TS流用的最多的格式,以及PAT和PMT等,現(xiàn)在說(shuō)一下TS流在解碼時(shí)是如何做到音視頻同步的。
時(shí)間標(biāo)記本身是以90KHz單位表達(dá)的33bit二進(jìn)制值,是MPEG-2系統(tǒng)層提供的一種機(jī)制,以便確保在解碼器上相關(guān)的原始流之間正確的同步。時(shí)間標(biāo)記有兩類:一個(gè)是解碼時(shí)間標(biāo)記(DTS,Decode Time Stamp), 它規(guī)定了在某時(shí)間應(yīng)該從解碼器緩沖區(qū)中刪除一個(gè)訪問(wèn)單元并解碼,但是不進(jìn)行播放;另一個(gè)是顯示時(shí)間標(biāo)記(PTS,Present Time Stamp),它規(guī)定了在某時(shí)刻,解碼的圖像最后從臨時(shí)緩存中釋放出來(lái)并進(jìn)行播放。這樣PTS將總是比與之相關(guān)的DTS大。
在MPEG-2編碼器中有一個(gè)系統(tǒng)時(shí)鐘,該系統(tǒng)時(shí)鐘用來(lái)生成一個(gè)共同的時(shí)序以便音視頻能夠正常的解碼與播放。因?yàn)榫幋a器有共同的系統(tǒng)時(shí)鐘STC,解碼器中的時(shí)鐘可以根據(jù)PCR重新恢復(fù)。所以端到端的同步分為以下幾個(gè)步驟:
(1) 解碼器接收到PCR時(shí),恢復(fù)系統(tǒng)時(shí)鐘;
(2) 解碼器接收到PTS/DTS時(shí),存入對(duì)應(yīng)的堆棧;
(3) 每幅圖像解碼前,用其對(duì)應(yīng)的DTS與系統(tǒng)時(shí)鐘STC進(jìn)行比較,當(dāng)兩者相等時(shí),就開(kāi)始解碼;
(4) 每幅圖像播放前,用其對(duì)應(yīng)的PTS與系統(tǒng)時(shí)鐘STC進(jìn)行比較,當(dāng)兩者相等時(shí),就開(kāi)始播放。
實(shí)際應(yīng)用時(shí),解碼器一般都有自主的系統(tǒng)時(shí)鐘頻率,不能直接拿編碼器的PCR設(shè)置為解碼器的系統(tǒng)時(shí)鐘STC,而是利用接收到的PCR值,通過(guò)鎖相環(huán)PLL校正解碼器的系統(tǒng)時(shí)鐘STC。
VLC調(diào)試接收TS流的代碼分析見(jiàn)鏈接:vlc源碼分析(四) 調(diào)用libts接收TS流,對(duì)理解上述過(guò)程非常有幫助。
聯(lián)系客服