*NOTE:TS流和PS流的區别:TS流的包結構是長度是固定的;PS流的包結構是可變長度的。 這導緻了 TS流的抵抗傳輸誤碼的能力強于PS流 (TS碼流由于采用了固定長度的包結構, 當傳輸誤碼破壞了某一TS包的同步信息時,接收機可在固定的位置檢測它後面包中的同步信息,從而恢複同步,避免了信息丢失。 而PS包由于長度是變化的,一旦某一 PS包的同步信息丢失, 接收機無法确定下一包的同步位置,就會造成失步,導緻嚴重的信息丢失。 因此,在信道環境較為惡劣,傳輸誤碼較高時,一般采用TS碼流;而在信道環境較好,傳輸誤碼較低時,一般采用PS碼流。)
由于TS碼流具有較強的抵抗傳輸誤碼的能力,因此目前在傳輸媒體中進行傳輸的MPEG-2碼流基本上都采用了TS碼流的包格。
TS流生成流程圖
從上圖可以看出,視頻ES和音頻ES通過打包器和共同或獨立的系統時間基準形成一個個PES, 通過TS複用器複用形成的傳輸流。 注意這裡的TS流是 位流格式(分析Packet的時候會解釋),也即是說TS流是可以按位讀取的。
TS流的格式TS流是基于Packet的位流格式,即由n個包組成;每個包是188個字節(或204個字節,在188個字節後加上了16字節的CRC校驗數據)
包頭
namebit位描述sync_Byte8 bits同步字節,固定是0x47transport_error_indicator1 bits錯誤指示信息(1:該包至少有1bits傳輸錯誤)payload_unit_start_indicator1 bits負載單元開始标志(packet不滿188字節時需填充)transport_priority1 bits傳輸優先級标志(1:優先級高)PID13 bitsPacket ID号碼,唯一的号碼對應不同的包transport_scrambling_control2 bits加密标志(00:未加密;其他表示已加密)adaptation_field_control2 bits附加區域控制continuity_counter4 bits包遞增計數器
TS流中PID的分配TS流中PID的分配
表PID值PAT0x0000CAT0x0001TSDT0x0002預留0x0003 至0x000FNIT ST0x0010SDT , BAT, ST0x0011EIT, ST0x0012RST, ST0x0013TDT, TOT, ST0x0014網絡同步0x0015預留使用0x0016 至 0x001B帶内信令0x001CDIT0x001ESIT0x001F
術語業務與事件PSI/SI表
如上圖所示,現實情況下,舉個例子,在上圖位于Services,而比如CCTV1~CCTV14對應不同的components,
PAT 節目關聯表 Program Association TablPID為0x0000 ,TS碼流解析從PAT表開始PAT表攜帶以下信息TS流IDtransport_stream_id該ID标志唯一的流ID節目頻道号program_number該号碼标志TS流中的一個頻道,該頻道可以包含很多的節目(即可以包含多個Video PID和Audio PID)PMT的PIDprogram_map_PID表示本頻道使用哪個PID作為PMT的PID。因為可以有很多的業務,因此DVB規定PMT的PID可以由用戶自己定義
PAT數據包分為兩個部分,一個是PAT數據包頭部(前8個Byte),一個是循環部分
/*頭部部分 8個Byte*/
program_association_section()
{
unsigned table_id : 8; //固定為0x00 ,标志是該表是PAT表
unsigned section_syntax_indicator : 1; //段語法标志位,固定為1
unsigned ‘0’ : 1; //0
unsigned reserved_1 : 2; // 保留位
unsigned section_length : 12; //段長度字節,表示從下一個字段開始到CRC32(含)之間有用的字節數
unsigned transport_stream_id : 16; //該傳輸流的ID,區别于一個網絡中其它多路複用的流
unsigned reserved_2 : 2;// 保留位
unsigned version_number : 5; //範圍0-31,表示PAT的版本号
unsigned current_next_indicator : 1; //發送的PAT是當前有效還是下一個PAT有效
unsigned section_number : 8; //分段的号碼。PAT可能分為多段傳輸,第一段為00,以後每個分段加1,最多可能有256個分段 給出section号,在sub_table中,第一個section其section_number為"0x00",每增加一個section,section_number加一
unsigned last_section_number : 8; //最後一個分段的号碼 ,sub_table中最後一個section的section_number
/*循環部分 4個Byte*/
for(i=0;i<N;i )
{
program_number :16; //節目号
reserved :3; //保留位
network_id 或 program_map_PID :13; //網絡信息表(NIT)的PID,節目号為0時對應的PID為network_PID;其餘情況是program_map_PID(PMT的PID)
}
CRC_32 :32;
}123456789101112131415161718192021222324
(1) 當前頻道中包含的所有Video數據的PID
(2) 當前頻道中包含的所有Audio數據的PID
(3) 和當前頻道關聯在一起的其他數據的PID(如數字廣播,數據通訊等使用的PID)
PMT 表頭
TS_program_map_section() {
table_id :8; //固定為0x02 标識PMT表
section_syntax_indicator :1; //固定為0x01
'0' :1; //
reserved :2; // 保留位
section_length :12 //該字段的頭兩bit必為‘00’,剩餘10bit指定該分段的字節數,緊随section_length 字段開始,并包括CRC。此字段中的值應不超過1021(0x3FD)。
program_number :16 //指出TS流中Program map section的版本号
reserved :2 // 保留位
version_number :5 //指出TS流中Program map section的版本号
current_next_indicator :1 //當該位置1時,當前傳送的Program map section可用;
//當該位置0時,指示當前傳送的Program map section不可用,下一個TS流的Program map section有效
section_number :8 //固定為0x00
last_section_number :8 //固定為0x00
reserved :3 //保留
PCR_PID :13 //指明TS包的PID值,該TS包含有PCR域,
//該PCR值對應于由節目号指定的對應節目。
//如果對于私有數據流的節目定義與PCR無關,這個域的值将為0x1FFF。
reserved :4 //保留位
program_info_length :12 //節目信息長度。該字段的頭兩比特必為‘00’,剩餘10 比特指定緊随program_info_length 字段的描述符的字節數 ,
//(之後的是N個描述符結構,一般可以忽略掉,這個字段就代表描述符總的長度,單位是Bytes)緊接着就是頻道内部包含的節目類型和對應的PID号碼了
for (i = 0; i < N; i ) {
descriptor()
}
for (i = 0; i < N1; i ) {
stream_type :8 //流類型,标志是Video還是Audio還是其他數據。這裡是MPEG2視頻類型
reserved :3 //保留位
elementary_PID :13 //該節目的音頻或視頻PID
reserved :4 //保留位
ES_info_length :12 //該字段的頭兩比特必為‘00’,剩餘10比特指示緊随ES_info_length字段的相關節目元描述符的字節數。
for (i = 0; i < N2; i ) {
descriptor()
}
}
CRC_32 :32
}
更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!