介绍TS是每个包大小固定为188 (或204 )字节的包格式(容器),整体分为三层。
es层:音频视频数据
pes层:向es层添加时间戳、音频视频流标识等信息
ts层:向pes层添加识别和传输数据流所需的信息
TS层的TS层由TS头和自适应构成,内容由PID值标识,并且主要内容是PAT表、PMT表、频率流和视频流。
1、TS Header固定为4字节,如下所示。 字段
位元
说明
sync_byte
8
TS分组的标识符,固定为0x47
transport_error_indicator
1
传输错误指示灯。 1:表示ts报头中的adapt域之后有一个字节。 通常为0,该字节包含在adapt域中
payload_unit_start_indicator
1
称重传感器开始标志,个完整数据包开始时标记为1
transport_priority
1
传输的优先顺序,0为低优先顺序,1为优先顺序,通常取0
PID
13
表示该信息包有效载荷的数据类型,PAT :节目关联表,PID:0x000,PMT :传输流描述表PID:0x002
transport_scrambling_control
2
传输加扰控制,00表示未加密
adaptation_field_control
2
是否包括适应区,“00”保留; ‘01’是自适应域,其仅包括有效载荷; ‘10’仅包括自适应域,有效载荷; ‘11’具有自适应域和有效载荷两者
continuity_counter
4
向上计数,从0到f,不一定从0开始,但必须向上计数,且是用同一PID计数
注意:
1、PAT表和PMT表必须定期插入TS流中。 由于用户可以随时添加TS流,因此通常会为每个视频帧添加PAT和PMT。 PAT和PMT表是必需的,但也可以添加其他表,如业务描述表(SDT )
2、PAT软件包、PMT软件包不包含自适应域
2、adaptation :自适应域adaptation_field_length
8位
adaptation_field字节数在只包含适应域的情况下为183,在有有效载荷的情况下为0-182的区间内
discontinuity_indicator
1比特
1:表示当前传输流分组的不连续状态为真,将不连续分为基于系统时间的不连续和计数不连续
random_access_indicator
1比特
1 :指示当前传输流分组和可能具有相同PID的后续传输流分组
elementary _ stream _ priority _ indicator
1比特
传输流数据包的优先级
PCR_flag
1比特
1 :自适应域包含PCR
OPCR_flag
1比特
1 :自适应域包括OPCR
splicing_point_flag
1比特
指示splice_countdown字段必须存在于关联的自适应字段中,以指定拼接点的出现
transport_private_data_flag
1比特
是否包含private_data
adaptation _ field _ extension _ flag
1比特
是否包含扩展字段
program_clock_reference_base
33位
PCR_ base
program _ clock _ reference _ extension
9位
PCR_ext
transport_private_data_length
8位
补充:
1、示出了PCR:PCR_base的最后一个字节到达系统目标解码器的输入端的预期时间,并且被编码为两个部分,总共42比特、PCR _ base:33比特、PCR _ ext:9比特
3、PAT (节目相关表)table_id8 PAT表为0x00 section_syntax_indicator1为1 sect
ion_length 12 开头两比特必为‘0 0 ’,剩余 10 比特指定该分段的字节数,不应超过1021(0x3FD) transport_stream_id 16由用户规定 version_number 5 版本号,固定为00000,如果PAT有变化则版本号加1 current_next_indicato r 1 固定为1,表示这个PAT表可以⽤,如果为0则要等待下⼀个 PAT表 section_number 8 固定为0x00 last_section_number 8 固定为0x00 循环 program_number 16 可以把 program_number 用做为广播信道的标识 reserved 3 固定为111 PID 13 节⽬号对应内容的PID值 结束循环 CRC32 32 前⾯数据的CRC32校验码
例:如下是一个TS Pack(108字节),有效载荷为PAT表,
47 40 00 10 00 00 B0 0D 00 01 C1 00 00 00 01 E0 20 A2 C3 29 41 FF FF FF FF FF FF FF FF FF ….TS Header PAT表 无效填充
注:1、PAT包、PMT包不含自适应域
4、PMT(传输流描述表) table_id 8
PMT固定为0x02
section_syntax_indicator1固定为1section_lenth 12该字段的头两比特必为‘00’program_number16 version_number 5 当分段内承载的信息发生改变时,版本号应增 1 current_next_indicator 1 置于‘1’时指示发送的 TS_program_map_section 为当前有 效的 section_number 8 0x00 last_section_number 80×00 PCR_PID 13 指示传输流包的 PID program_info_length 12 该字段的头两比特必为‘ 00 ’ stream_type 8流类型:AVC:0x1b,H265:0x24 elementary_PID 13 指定承载相关节目元的传输流包的 PID ES_info_length 12该字段的头两比特必为‘00’ CRC_32 32
例:如下是一个TS Pack(108字节),有效载荷为PMT表
47 40 20 10 00 02 B0 12 00 01 C1 00 00 E0 22 F0 00 1B E0 22 F0 00 EB 47 5F DC FF FF FF FF FF FF ….TS Header PMT表 无效填充
5、PES
packet_start_code_prefix 24bitPES起始码:0x000001 stream_id 8bit ⾳频取值(0xc0-0xdf),通常为0xc0 视频取值(0xe0-0xef),通常为0xe0 PES_packet_length 16bit 后⾯pes数据的⻓度,0表示⻓度不限制, 只有视频数据⻓度会超过0xffff flag 通常取值0x80,表示数据不加密、⽆优先级、备份的数据 flag 取值0x80表示只含有pts,取值0xc0表示含有pts和dts pes data length 后⾯数据的⻓度,取值5或10 PTS 33bit DTS 33bit
例:如下是一个TS Pack(188字节),有效负载PES层数据+ES层数据(H264)
47 40 22 30 07 50 00 0D 54 CA 7E 53 00 00 01 E0 00 00 80 C0 0A 31 00 6B 53 29 11 00 6B 53 29 TS Header 自适应域 PES起始码:00 00 01 流ID:E0 字节数:00 00 00 00 00 01 09 F0 00 00 00 01 67 64 00 1F AC 2C 6A 81 40 16 E9 B8 08 08 08 10 00 00 00 01 68 ….NALU起始码 type:09(分解符) NALU….. 注: 视频DTS算法: dts = 初始值 + 90000 / video_frame_rate ,初始值可以随便指定,但是最好不要取0 4、ES层 ES层为元数据层,在此不赘述