标准定义

ISO/IEC 13818-1 (或 ITU-T H.222.0)

TS各个头部定义

TS Header

字段长度 (bits)含义与说明
sync_byte8同步字节,固定为 0x47。接收端通过扫描此字节来识别一个 TS 包的开始,并实现同步。
transport_error_indicator1传输错误指示符。用于指示该 TS 包中存在一个无法修复的错误。
payload_unit_start_indicator1负载单元开始标识。占用1bit,负载单元起始标识位,1:表示起始数据 0:表示累加数据.一个TS包固定为188字节,而一帧数据将会被分割为多个包,故通过起始标识符可以得知是否为新的数据帧.在前4个字节后会有一个调整字节。所以实际数据应该为去除第一个字节后的数据。即上面数据中红色部分不属于有效数据包。该字段用来表示TS包的有效净荷带有PES包或者PSI数据的情况。当TS包带有PES包数据时,payload_unit_start_indicator具有以下特点:置为1,表示TS包的有效净荷以PES包的第一个字节开始;置为0,表示TS包的开始不是PES包。当TS包带有PSI数据时,payload_unit_start_indicator具有以下特点:置为1,表示TS包带有PSI部分的第一个字节,即第一个字节带有指针pointer_field;置为0,表示TS包不带有一个PSI部分的第一个字节,即在有效净荷中没有指针pointer_field。对于空包的包,payload_unit_start_indicator应该置为0。
transport_priority1传输优先级。用于标识该 TS 包相对于同一 PID 的其他包具有更高的优先级。
PID13包标识符 (Packet Identifier)。用于唯一标识 TS 包所属的流类型,例如 PAT、PMT、视频流或音频流。
transport_scrambling_control2传输加扰控制。指示 TS 包负载的加密状态,00 表示未加扰(清流)。
adaptation_field_control2适配域控制。指示 TS 包是否包含适配域和/或负载域。
01: 无适配域,仅有负载
10: 仅有适配域,无负载
11: 同时包含适配域和负载
continuity_counter4连续性计数器。一个从 0 到 15 循环递增的计数器,用于检测同一 PID 的 TS 包是否发生丢失或乱序。

SDT(Service Description Table)

字段长度 (bits)含义与说明
table_id8表标识符。固定为 0x42,表示这是当前传输流的 SDT 信息(0x46 表示其他流)。
section_syntax_indicator1段语法标志。固定为 1,表示使用标准的段语法结构。
reserved_future_use2保留位。用于未来扩展,通常置为 11
reserved1保留位。防止控制字冲突,通常置为 0
section_length12段长度。指示从本字段之后到 CRC_32 结束的长度(单位字节),最大 1021 字节。
transport_stream_id16传输流 ID。唯一标识当前传输流的编号。
reserved2保留位。通常置为 11
version_number5版本号。当 SDT 内容更新时,该值加 1(0-31 循环),用于通知接收端更新缓存。
current_next_indicator1当前/下一指示符。1 表示当前发送的是正在使用的表;0 表示下一张表。
section_number8段号。当前段的序号,从 0 开始。
last_section_number8最后段号。该表最后一个段的序号。
original_network_id16原始网络 ID。标识该传输流所属的原始网络(如卫星轨道位置或地面广播网)。
Service Loop不定长见下方定义
CRC_3232循环冗余校验。用于检测整个表数据的完整性,确保没有传输错误。

Service Loop

字段长度 (bits)含义与说明
service_id16业务 ID。对应 PMT 表中的 program_number,是频道的唯一标识。
reserved_future_use6保留位。通常为 111111
EIT_schedule_flag1调度信息标志。1 表示该业务包含 EIT(电子节目指南)的调度信息(未来的节目单)。
EIT_present_following_flag1当前/后续信息标志。1 表示该业务包含当前正在播放和接下来播放的节目信息。
running_status3运行状态。
0: 未定义
1: 未运行
2: 几分钟后开始
3: 暂停
4: 正在播放
free_CA_mode1加密模式。
0: 所有业务组件均未加扰(免费)。
1: 业务组件受条件接收系统控制(加密/付费)。
descriptors_loop_length12描述符循环长度。指示后续描述符区域的总字节数。

PAT(Program Association Table)

字段长度 (bits)含义与说明
table_id8表标识符。固定为 0x00,明确标识这是一个 PAT 表。
section_syntax_indicator1段语法标志。固定为 1,表示采用标准的段语法。
reserved2保留位。通常置为 11
section_length12段长度。从本字段之后到 CRC_32 结束的字节数。
transport_stream_id16传输流 ID。用于区分网络中不同的 TS 流,由运营商指定。
reserved2保留位。通常置为 11
version_number5版本号。当 PAT 内容更新时,该值加 1(0-31 循环),用于通知接收端更新。
current_next_indicator1当前/下一指示符。1 表示当前发送的是正在使用的表;0 表示下一张表。
section_number8段号。当前段的序号,从 0 开始。
last_section_number8最后段号。该表最后一个段的序号。
Program Loop不定长见下方定义
CRC_3232循环冗余校验。用于检测整个表数据的完整性,确保没有传输错误。

Program Loop

字段长度 (bits)含义与说明
program_number16节目号。
• 非0值:代表一个具体的频道编号(如 1, 101 等)。
• 0x0000:这是一个特殊值,表示后面跟随的是网络信息表(NIT)的 PID。
reserved3保留位。通常置为 111
program_map_PID13PMT 的 PID。
• 如果 program_number 非 0,这里指向该节目对应的 PMT 表 所在的 PID。
• 如果 program_number 为 0,这里指向 NIT 表 的 PID。

PMT(Program Map Table)

字段长度 (bits)含义与说明
table_id8表标识符。固定为 0x02,明确标识这是一个 PMT 表。
section_syntax_indicator1段语法标志。固定为 1
reserved2保留位。通常置为 11
section_length12段长度。从本字段之后到 CRC_32 结束的字节数。
program_number16节目号。与 PAT 表中的 program_number 对应,表明这张 PMT 属于哪个频道。
reserved2保留位。通常置为 11
version_number5版本号。当 PMT 内容更新时,该值加 1(0-31 循环)。
current_next_indicator1当前/下一指示符。1 表示当前表有效;0 表示下一张表有效。
section_number8段号。PMT 通常不分段,固定为 0x00
last_section_number8最后段号。固定为 0x00
Program Info不定长见下方定义
CRC_3232循环冗余校验。用于检测整个表数据的完整性,确保没有传输错误。

Program Info

字段长度 (bits)含义与说明
reserved3保留位。通常置为 111
PCR_PID13节目时钟参考 PID。
指示包含 PCR(Program Clock Reference)字段的 TS 包的 PID。接收端利用 PCR 来恢复系统时钟,实现音视频同步。通常与视频 PID 相同。
reserved4保留位。通常置为 1111
program_info_length12Elementary Stream Loop 节目描述信息长度。指示紧随其后的描述符区域的字节数。

Elementary Stream Loop

字段长度 (bits)含义与说明
stream_type8流类型。
指示该流的编码格式,例如:
0x1B: H.264 视频
0x24: H.265 (HEVC) 视频
0x0F: AAC 音频
0x03: MPEG-1 音频
reserved3保留位。通常置为 111
elementary_PID13基本流 PID。
这是最重要的字段之一,指示视频、音频或字幕数据所在的 TS 包 PID。
reserved4保留位。通常置为 1111
ES_info_length12ES 信息长度。指示紧随其后的 ES 描述符的字节数。