TS(Transport Stream)流由TS包组成,而每个TS包的⻓度:固定为188 Bytes或204 Bytes,204 Bytes⻓度是在188Bytes后⾯增加了16 Bytes的CRC校验数据。
ts 层的内容是通过 PID 值来标识的,主要内容包括:PAT 表、PMT 表、音频流、视频流。解析 ts 流要先找到 PAT 表,只要找到 PAT 就可以找到 PMT,然后就可以找到视频流了。PAT 表和 PMT 表需要定期插入ts 流,因为用户随时可能加入ts 流,这个间隔较小,通常每隔几个视频帧就要加入PAT和 PMT。PAT 和 PMT 表是必须的,还可以加入其它表如 SDT(业务描述表)等,不过 hls 流只要有PAT 和 PMT 就可以播放了。
PAT表:主要的作用就是指明了 PMT 表的 PID 值。能找到PAT。PAT的pid默认值是0。通过PAT能够解析出当前ts流包含的节目数量以及对应节目PMT的PID。
PMT表:主要作用就是指明了音视频流的PID值。通过PMT的PID值就可以区分那个包是视频数据,那个包是音频数据。
音频流:编码好的音频数据。
视频流:编码好的视频数据。
TS包的详细字段
1、TS头
TS包的payload:音频PES包,视频PES包,节目专用信息PSI ,空包,PAT,PMT。

字段说明:
sync_byte (同步字节):固定为0100 0111 (0x47);该字节由解码器识别,使包头和有效负载可相互分离。
transport_error_indicator(传输错误指示):‘1’表示在相关的传输包中至少有一个不可纠正的错误位。当被置1后,在错误被纠正之前不能重置为0。
payload_unit_start_indicator(开始指示):为1时,在前4个字节之后会有一个调整字节,其的数值为后面调整字段的长度length。因此有效载荷开始的位置应再偏移1+[length]个字节。transport_priority(传输优先级):‘1’表明优先级比其他具有相同PID 但此位没有被置‘1’的分组高
PID:指示存储与分组有效负载中数据的类型。PID 值 0x0000—0x000F 保留。其中
0x0000为PAT;
0x0001为CAT;
0x0002为PMT;
0x1fff为分组保留,即空包。
transport_scrambling_control(加扰控制):表示TS流分组有效负载的加密模式。空包为‘00’,如果传输包包头中包括调整字段,不应被加密。
adaptation_field_control(适配域控制):表示包头是否有调整字段或有效负载。‘00’为ISO/IEC未来使用保留;‘01’仅含有效载荷,无调整字段;‘10’ 无有效载荷,仅含调整字段;‘11’ 调整字段后为有效载荷,调整字段中的前一个字节表示调整字段的长度length,有效载荷开始的位置应再偏移[length]个字节。空包应为‘10’。
continuity_counter(连续性计数器):随着每一个具有相同PID的TS流分组而增加,当它达到最大值后又回复到0。范围为0~15,检查数据掉失。
PID对应表

2、PAT(Program Association Table) 节目关联表(最关键数据PAT和PMT,没有无法解码)
typedef struct TS_PAT
{
unsigned table_id : 8; //固定为0x00 ,标志是该表是PAT表
unsigned section_syntax_indicator : 1; //段语法标志位,固定为1
unsigned zero : 1; //0
unsigned reserved_1 : 2; // 保留位
unsigned section_length : 12; //表示从下一个字段开始到CRC32(含)之间有用的字节数
unsigned transport_stream_id : 16; //该传输流的ID,区别于一个网络中其它多路复用的流
unsigned reserved_2 : 2;// 保留位
unsigned version_number : 5; //范围0-31,表示PAT的版本号
unsigned current_next_indicator : 1; //发送的PAT是当前有效还是下一个PAT有效
unsigned section_number : 8; //分段的号码。PAT可能分为多段传输,第一段为00,以后每个分段加1,最多可能有256个分段
unsigned last_section_number : 8; //最后一个分段的号码
std::vector<TS_PAT_Program> program;
unsigned reserved_3 : 3; // 保留位
unsigned network_PID : 13; //网络信息表(NIT)的PID,节目号为0时对应的PID为network_PID
unsigned CRC_32 : 32; //CRC32校验码
} TS_PAT;
3、 PMT(Program Map Table)节目映射------由PAT指定PID值
PMT在传送流中用于指示组成某一套节目的视频、音频和数据在传送流中的位置,即对应的TS包的PID值,以及每路节目的节目时钟参考(PCR)字段的位置。

字段说明
Table id :固定为0x02,标志该表是PMT 表。
Section syntax indicator:对于PMT表,设置为1 。
Section length:表示这个字节后面有用的字节数,包括CRC32 。
Program number:它指出该节目对应于可应用的Program map PID 。
Version number:指出PMT 的版本号。
Current next indicator:当该位置’1’时,当前传送的Program map section可用;当该位置’0’时,指示当前传送的Program map section不可用,下一个TS流的Programmap section 有效。
Section number:总是置为0x00(因为PMT表里表示一个service的信息,一个section 的长度足够)。
Last section number:该域的值总是0x00 。
PCR PID:节目中包含有效PCR字段的传送流中PID 。
Program info length:12bit域,前两位为00。该域指出跟随其后对节目信息的描述的byte 数。
Stream type:8bit域,指示特定PID的节目元素包的类型。该处PID由elementary PID 指定。下表所示为对应原始流的类型。
原始流的类型
值 | 描述 |
0x00 | ITU-T|ISO/IEC保留 |
0x01 | ISO/IEC 11172视频 |
0x02 | ITU-T Rec.H.262|ISO/IEC 13818-2视频 |
0x03 | ISO/IEC 11172音频 |
0x04 | ISO/IEC 13818-3音频 |
0x05 | ITU-T Rec.H.222.0|ISO/IEC 13818-1私用分段 |
0x06 | 含有私用数据的ITU-T Rec.H.222.0|ISO/IEC 13818-1分组 |
0x07 | ISO/IEC 13522 MHEG |
0x08 | ITU-T Rec.H.222.0|ISO/IEC 13818-1 DSM CC |
0x09 | ITU-T Rec.H.222.0|ISO/IEC 13818-1/11172-1 |
0x10 ~ 0x7F | ITU-T Rec.H.222.0|ISO/IEC 13818-1保留 |
0x80 ~ 0xFF | 用户私有 |