據傳輸媒體的品質不同,MPEG-2中定義了兩種複合資訊流:傳送流(TS:TransportStream)和節目流(PS:ProgramStream)
TS流與PS流的差別在于TS流的包結構是固定長度的,而PS流的包結構是可變長度的。
PS包與TS包在結構上的這種差異,導緻了它們對傳輸誤碼具有不同的抵抗能力,因而應用的環境也有所不同。TS碼流由于采用了固定長度的包結構,當傳輸誤碼破壞了某一TS包的同步資訊時,接收機可在固定的位置檢測它後面包中的同步資訊,進而恢複同步,避免了資訊丢失。而PS包由于長度是變化的,一旦某一PS包的同步資訊丢失,接收機無法确定下一包的同步位置,就會造成失步,導緻嚴重的資訊丢失。是以,在信道環境較為惡劣,傳輸誤碼較高時,一般采用TS碼流;而在信道環境較好,傳輸誤碼較低時,一般采用PS碼流。
由于TS碼流具有較強的抵抗傳輸誤碼的能力,是以目前在傳輸媒體中進行傳輸的MPEG-2碼流基本上都采用了TS碼流的包格式。
MPEG2-PS主要應用于存儲的具有固定時長的節目,如DVD電影,而MPEG-TS則主要應用于實時傳送的節目,比如實時廣播的電視節目。這兩種格式的主要差別是什麼呢?你将DVD上的VOB檔案的前面一截剪掉(或者幹脆就是資料損壞),那麼就會導緻整個檔案無法解碼,而電視節目是你任何時候打開電視機都能解碼(收看)的,是以,MPEG2-TS格式的特點就是要求從視訊流的任一片段開始都是可以獨立解碼的。
TS包長度為188位元組,由標頭和包資料2部分組成,其中標頭還可以包括擴充的自适用區。標頭長度占4bytes,自使用區和包資料共占184bytes,這184個位元組不一定都是有效資料,有一些可能為填充資料。整個TS包長度相當于4個ATM包長。TS包的標頭由如下圖摘錄所示的同步位元組、傳輸誤碼訓示符、有效載荷單元起始訓示符、傳輸優先、包識别(PID-Packet Identification)、傳輸加擾控制、自适應區控制和連續計數器8個部分組成。
TS標頭定義:
標頭4個Byte
//Transport Stream header
typedef struct TS_header
{
unsigned sync_byte :8; //同步位元組,固定為0x47 ,表示後面的是一個TS分組,當然,後面包中的資料是不會出現0x47的
unsigned transport_error_indicator :1; //傳輸錯誤标志位,一般傳輸錯誤的話就不會處理這個包了
unsigned payload_unit_start_indicator :1; //有效負載的開始标志,根據後面有效負載的内容不同功能也不同
// payload_unit_start_indicator為1時,在前4個位元組之後會有一個調整位元組,它的數值決定了負載内容的具體開始位置。
unsigned transport_priority :1; //傳輸優先級位,1表示高優先級
unsigned PID :13; //有效負載資料的類型
unsigned transport_scrambling_control :2; //加密标志位,00表示未加密
unsigned adaption_field_control :2; //調整字段控制,。01僅含有效負載,10僅含調整字段,11含有調整字段和有效負載。為00的話解碼器不進行處理。
unsigned continuity_counter :4; //一個4bit的計數器,範圍0-15
} TS_header;
//特殊參數說明:
//sync_byte:0x47
//payload_unit_start_indicator:0x01表示含有PSI或者PES頭
//PID:0x0表示後面負載内容為PAT,不同的PID表示不同的負載
//adaption_field_control:
// 0x0: // reserved for future use by ISO/IEC
// 0x1: // 無調整字段,僅含有效負載
// 0x2: // 僅含調整字段,無有效負載
// 0x3: // 調整字段後含有效負載
第一個包的開頭為47 40 00 X,此時pid為0,0x0表示後面負載内容為PAT,不同的PID表示不同的負載。
payload_unit_start_indicator為1時,在前4個位元組之後會有一個調整位元組,它的數值決定了負載内容的具體開始位置。現在看例子中的資料47 40 00 17 00第五個位元組是00,說明緊跟着00之後就是具體的負載内容。
從PAT中根據program_map_PID找到對應的含有PMT(Program Map Table)的包。
在MPEG-2協定中,采用了一種索引的思路來進行節目的尋找
1、 找到PAT表
2、 PAT表之是以叫做節目關聯表,就是因為它指出了 目前這個TS流中包含的各個節目其各自所對應的 PMT表的PID
3、 既然我們能知道某個節目它的PMT表所在的TS包 的PID了,那我們就能通過檢索PID的方式,把這個 PMT表找出來
4、 PMT表叫做節目映像表,它指出了它所描述的節目 其所對應的視訊流、音頻流、PCR(時間參考資訊) 的PID
5、 既然有了流所在TS包的PID, 那就在目前TS流中過濾出PID等于這個PID值的包, 這些過濾出來的包依序排列,就可以從中還原出流了。
6、 有了視訊基本流、音頻基本流、參考時鐘,機頂盒就能夠對節目進行解碼,輸出顯示在電視畫面上了。
TS 流解碼過程:
1. 擷取TS中的PAT
2. 擷取TS中的PMT
3. 根據PMT可以知道目前網絡中傳輸的視訊(音頻)類型(H264),相應的PID,PCR的PID等資訊。
4. 設定demux 子產品的視訊Filter 為相應視訊的PID和stream type等。
5. 從視訊Demux Filter 後得到的TS資料包中的payload 資料就是 one piece of PES,在TS header中有一些關于此 payload屬于哪個 PES的 第多少個資料包。 是以軟體中應該将此payload中的資料copy到PES的buffer中,用于拼接一個PES包。
6. 拼接好的PES包的標頭會有 PTS,DTS資訊,去掉PES的header就是 ES。
7. 直接将 被被拔掉 PES標頭的ES包送給decoder就可以進行解碼。解碼出來的資料就是一幀一幀的視訊資料,這些資料至少應當與PES中的PTS關聯一下,以便進行視音頻同步。
8. I,B,B,P 資訊是在ES中的。
參考資料:
MPEG2 PS和TS流格式