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=======