TS解析文档
TS格式解析
簡介:
ts文件為傳輸流文件,視頻編碼主要格式h264/mpeg4,音頻為acc/MP3。 ts的包是一個一個188字節的包組成,這188字節里面由一個0x47開頭的包作為同步。 也就是說,如果你找到了0x47,如果與它相隔188個字節的地方又是一個0x47,基本上就是一個ts的包。 注:ts包中有內容為0x47,所以分割時確定是ts包之后,直接以188字節分割。結構:
ts文件分為三層:ts層Transport Stream:ts層就是在pes層加入數據流的識別和傳輸必須的信息。pes層 Packet Elemental Stream:pes層是在音視頻數據上加了時間戳等對數據幀的說明信息。es層 Elementary Stream.:es層就是音視頻數據。解析步驟
- ts流 發送方式:->PAT ->PMT ->PES ->ES ->ES ->ES ->ES ->PES -> ES ->ES …
ts header
ts層分為三個部分:ts header:固定4個字節。adaptation field:可有可無,作用是給不足188字節的數據做填充。payload:pes數據。ts header:詳解如下:
| sync_byte | 8b | 固定為0x47 |
| transport_error_indicator | 1b | 傳輸錯誤指示符,表明在ts頭的adapt域后由一個無用字節,通常為0 |
| payload_unit_start_indicator | 1b | 負載單元起始標示符, |
| transport_priority | 1b | 傳輸優先級,0為低優先級,1為高優先級,通常取0 |
| pid | 13b | pid值 |
| transport_scrambling_control | 2b | 自適應區,‘00’保留;‘01’為無自適應域,僅含有效負載;‘10’為僅含自適應域,無有效負載;‘11’為同時帶有自適應域和有效負載。(自適應域:adaptation field) |
| adaptation_field_control | 2b | pid值 |
| continuity_counter | 4b | 遞增計數器,從0-f,起始值不一定取0,但必須是連續的 |
adaptation field
adaptation field:詳解如下:
| adaptation_field_length | 1B | 自適應域長度,后面的字節數 |
| flag | 1B | 取0x50表示包含PCR或0x40表示不包含PCR |
| PCR | 5B | Program Clock Reference,節目時鐘參考,用于恢復出與編碼端一致的系統時序時鐘STC(System Time Clock)。 |
| stuffing_bytes | xB | 填充字節,取值0xff |
PAT 格式
| table_id | 8b | PAT表固定為0x00 |
| section_syntax_indicator | 1b | 固定為1 |
| zero | 1b | 固定為0 |
| reserved | 2b | 固定為11 |
| section_length | 12b | 后面數據的長度 |
| section_length | 16b | 傳輸流ID,固定為0x0001 |
| reserved | 2b | 固定為11 |
| version_number | 5b | 版本號,固定為00000,如果PAT有變化則版本號加1 |
| current_next_indicator | 1b | 為1,表示這個PAT表可以用,為0則要等待下一個PAT表 |
| section_number | 8b | 固定為0x00 |
| last_section_number | 8b | 固定為0x00 |
| program_number | 16b | 節目號為0x0001時,表示這是PMT |
| reserved | 3b | 固定為111 |
| PID | 13b | 節目號對應內容的PID值 |
| CRC32 | 32b | 前面數據的CRC32校驗碼 |
注:ts header之后,PAT表之前有1字節無用,需要排除
PMT格式
| table_id | 8b | PAT表固定為0x02 |
| section_syntax_indicator | 1b | 固定為1 |
| zero | 1b | 固定為0 |
| reserved | 2b | 固定為11 |
| section_length | 12b | 后面數據的長度 |
| section_length | 16b | 頻道號碼,表示當前的PMT關聯到的頻道,取值0x0001 |
| reserved | 2b | 固定為11 |
| version_number | 5b | 版本號,固定為00000,如果PMT有變化則版本號加1 |
| current_next_indicator | 1b | 為1,表示這個PMT表可以用,為0則要等待下一個PAT表 |
| section_number | 8b | 固定為0x00 |
| last_section_number | 8b | 固定為0x00 |
| reserved | 8=3b | 固定為111 |
| PCR_PID | 13b | PCR(節目參考時鐘)所在TS分組的PID,指定為視頻PID |
| reserved | 4b | 固定為1111 |
| program_info_length | 12b | 節目描述信息,指定為0x000表示沒有 |
| stream_type | 8b | 流類型,h.264編碼對應0x1b,aac編碼對應0x0f,mp3編碼對應0x03,h.265編碼對應0x24 |
| reserved | 3b | 固定為111 |
| elementary_PID | 13b | 與stream_type對應的PID |
| reserved | 4b | 固定為1111 |
| ES_info_length | 12b | 描述信息,指定為0x000表示沒有 |
| CRC32 | 32b | 前面數據的CRC32校驗碼 |
注:ts header之后,PMT表之前有1字節無用,需要排除
PES格式
| pes_start_code | 3B | 開始碼,固定為0x000001 |
| stream_id | 1B | 音頻取值(0xc0-0xdf),通常為0xc0;視頻取值(0xe0-0xef),通常為0xe0 |
| pes_packet_length | 2B | 后面pes數據的長度,0表示長度不限制,只有視頻數據長度會超過0xffff(注:長度為整個pes,即為第一個pes頭、es+之后的es) |
| flag | 1B | 通常取值0x80,表示數據不加密、無優先級、備份的數據 |
| flag | 1B | 取值0x80表示只含有pts,取值0xc0表示含有pts和dts |
| pes_data_length | 1B | 后面數據的長度,取值5或10 |
| pts | 5B | 33bit值 |
| dts | 5B | 33bit值 |
ES格式
視頻數據必須加上一個nalu(Network Abstraction Layer unit),nalu包括nalu header和nalu type. nalu header固定為0x00000001(幀開始,常見)或0x000001(幀中)。nalu header:
| forbidden_zero_bit | 1b |
| nal_unit_type | 6b |
| nuh_reserved_zero_6bits | 6b |
| nuh_temporal_id_plus1 | 3b |
H265 幀類型判斷:
在文件中查找00 00 00 01NALU頭,發現在有6種開頭分別為:
總結
- 上一篇: Apollo进阶课程㉝丨Apollo R
- 下一篇: 4.2)深度卷积网络:实例研究