天天看点

TS流分析-packet header

ts流是由ts包构成的,ts包的长度固定为188或者204,后者是加上校验的长度。对应的官方描述文档为:iso-13818-1.pdf,下载地址:

ts数据包的包头占4个字节,其构成如下:

/**
   * Packet Header(包头)信息说明 <br>
   * 1 sync_byte 8bits 同步字节 <br>
   * 2 transport_error_indicator 1bit 错误指示信息(1:该包至少有1bits传输错误) <br>
   * 3 payload_unit_start_indicator 1bit 负载单元开始标志(packet不满188字节时需填充)<br>
   * 4 transport_priority 1bit 传输优先级标志(1:优先级高) <br>
   * 5 PID 13bits Packet ID号码,唯一的号码对应不同的包 <br>
   * 6 transport_scrambling_control 2bits 加密标志(00:未加密;其他表示已加密) <br>
   * 7 adaptation_field_control 2bits 附加区域控制 <br>
   * 8 continuity_counter 4bits 包递增计数器
   * */      

需要注意PID,PID的不同标识这不同的包类型。

标准文档摘录:

2.4.3.3  传输流包层中字段的语义定义

sync_byte — sync_byte 为固定的 8 比特字段,其值为 '0100 0111' (0x47) 。在对于其他正式出现字段的

赋值选择中,诸如 PID ,应避免 sync_byte 仿真。

transport_error_indicator — transport_error_indicator  为 1 比特标志。置于 1 时,它指示在相关传输流

包中至少存在 1 个不可校正比特错。此比特可以由传输层以外的实体设置为‘ 1 ’。设置为‘ 1 ’时,此比特

应不重新设置为‘ 0 ’,除非误差比特值已经校正。

payload_unit_start_indicator — payload_unit_start_indicator 为 1 比特标志,对于承载 PES 包(参阅

2.4.3.6 )或 PSI 数据(参阅 2.4.4 )的传输流包,它具有标准含义。

当传输流包有效载荷包含 PES 包数据时, payload_unit_start_indicator 具有以下意义:‘ 1 ’指示此传输

流包的有效载荷应随着 PES 包的首字节开始,‘ 0 ’指示在此传输流包中无任何 PES 包将开始。若

payload_unit_start_indicator  设置为‘ 1 ’,则一个且仅有一个 PES 包在此传输流包中起始。这也适用于

stream_type 6 的专用流(参阅表 2-34 )。

当传输流包有效载荷包含 PSI 数据时, payload_unit_start_indicator  具有以下意义:若传输流包承载 PSI

分段的首字节,则 payload_unit_start_indicator 值必为 1 ,指示此传输流包的有效载荷的首字节承载

pointer_field 。若传输流包不承载 PSI 分段的首字节,则 payload_unit_start_indicator  值必为‘ 0 ’,指示在此

有效载荷中不存在 pointer_field 。参阅 2.4.4.1 和 2.4.4.2 。这也适用于 stream_type 5 的专用流(参阅表 2-34 )。

对空包而言, payload_unit_start_indicator 必须设置为‘ 0 ’。

仅承载专用数据的传输流包的此比特含义在本规范中未定义。

transport_priority — transport_priority  为 1 比特指示符。设置为‘ 1 ’时,它指示该相关包比具有相

同 PID 但不具有该比特设置为 1 的其他包有更大的优先级。传输机制可以使用该字段优先考虑基本流内的

该包数据。取决于应用, transport_priority  字段可以不管 PID 或者此字段仅在一个 PID 范围内编码。此字段

可以由信道特定编码器或解码器来改变。

PID — PID 为 13 比特字段,指示包有效载荷中存储的数据类型。 PID 值 0x0000 为节目相关表所保留

(见表 2-30 )。 PID 值 0x0001 为有条件访问表所保留(见表 2-32 )。 PID  值 0x0002  为传输流描述表所保留(见

表 2-36 ), PID  值 0x0003  为 IPMP  控制信息表(见 ISO/IEC 13818-11 ), PID  值 0x0004-0x000F 为保留的值。

PID 值 0x1FFF 为空包所保留(见表 2-3 )。

transport_scrambling_control — 此 2 比特字段指示传输流包有效载荷的加扰方式。传输流包头以及

自适应字段若存在,应不加扰。在空包的情况中, transport_scrambling_control  字段的值应设置为“ 00 ”

adaptation_field_control — 此 2  比特字段指示此传输流包头是否后随自适应字段和 / 或有效载荷

continuity_counter — continuity_counter  为 4 比特字段,随着具有相同 PID 的每个传输流包而增加。

continuity_counter  在取其最大值之后循环返回到 0 值。当包的 adaptation_field_control 为‘ 00 ’或‘ 10 ’时,

continuity_counter  不增加。

传输流中,复制包可以作为 2 个并且仅只作为 2 个具有相同 PID 的连续传输流包。该复制包必须有

与原始包相同的 continuity_counter  赋值并且 adaptation_field_control  字段必须等于‘ 01 ’或‘ 11 ’。复制

包中,原始包的每个字节都必须复制,有一种情况除外,即节目时钟参考字段中的内容若存在,该有效

值必须编码。

特定传输流包中 continuity_counter 是连续的,只要它与具有相同 PID 的先前的传输流包中的

continuity_counter  赋值的差为正值 1 ,或者任意一个非增量条件( adaptation_field_control  设置为‘ 00 ’或

‘ 10 ’,或如上所述的复制包)被满足时。 discontinuity_indicator  设置为‘ 1 ’时,连续性计数器可以中断(参

阅 2.4.3.4 )。在空包的情况中, continuity_counter  值未确定。

data_byte — data_byte  必须是来自 PES 包(参阅 2.4.3.6 )、 PSI 分段(参阅 2.4.4 )以及 PSI 分段后的

包填充字节数据的相连贯的数据字节,或者不在这些结构中的专用数据,如 PID 所指示的。在具有 PID 值

0x1FFF 的空包情况中, data_bytes 可以指派为任何值。 data_bytes  数 N 通过 184 减去 adaptation_field()  中的

字节数来确定,如以下 2.4.3.4 中所述。

实例解析:

byte_arr:47 40 00 30 a6 00 ff ff

======== RTP packet header分析 =======

0 1 0 0 0 1 1 1 01 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 01 1 0 0 0 0 1 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

同步字节      : 0x47 二进制:01000111

错误指示信息    : 0x0  二进制:0

负载单元开始标志  : 0x1 二进制:1

传输优先级标志   : 0x0 二进制:0

ID号码       : 0x0 二进制:0000000000000

加密标志      : 0x0 二进制:00

附加区域控制    : 0x3 二进制:11

包递增计数器    : 0x0 二进制:0000

======== OVER=======