MPEG-TS(MPEG Transport Stream,MPEG传输流)是一种视频、音频、数据等多媒体内容的封装格式,广泛应用于数字广播、流媒体传输、卫星电视、IPTV、蓝光光盘等领域。它是一种针对实时传输设计的格式,具有较强的错误恢复能力和实时传输的特性。
将媒体数据进行MPEGTS格式的封装时候分三层:
1.ES流层(原始数据压缩或者编码后)
2.PES流层(对ES层进行打包,加上PTS/DTS等时间戳信息。一个PES包通常只含一帧视频帧而一个PES包中的音频帧可以有多帧。低分辨率场景下可能合并多帧非连续关键帧的视频帧)
3.TS流层(网络上传输的一个一个的TS包,国区标准一个TS包为188字节,如果在将PES包进行打包的时候,一个PES包不足184字节(去掉TS包头的4个字节)时,他会进行多于字节的填充填到一个TS符合188字节为止。)
MPEG-TS 包头结构(通常为4字节(32位),包含了包的同步字、PID(Packet Identifier)、包的长度、错误检查等控制信息。)
字段名 | 比特位 | 长度 | 说明 |
---|---|---|---|
Sync Byte | 0-7 | 8 | 固定为 0x47 ,用于标识TS包的开始。 |
Transport Error Indicator | 8 | 1 | 1 表示传输错误(如调制误码),通常为 0 。 |
Payload Unit Start Indicator | 9 | 1 | 1 表示负载起始(如PES头或PSI表起始)。 |
Transport Priority | 10 | 1 | 1 表示高优先级(用于网络拥塞时优先传输)。 |
PID (Packet Identifier) | 11-23 | 13 | 包的唯一标识符(如0x0000 为PAT表,0x0020 为视频流)。 |
Transport Scrambling Control | 24-25 | 2 | 00 表示未加密,其他值表示加密模式。 |
Adaptation Field Control | 26-27 | 2 | 01 :仅负载;10 :仅适配字段;11 :负载+适配字段;00 :保留。 |
Continuity Counter | 28-31 | 4 | 每个PID的递增计数器(0~15循环),用于检测丢包或重复。 |
适配字段(Adaptation Field)结构
字段名 | 长度 | 说明 |
---|---|---|
Adaptation Field Length | 1字节 | 适配字段的总长度(不包括本字节)。 |
Discontinuity Indicator | 1 bit | 1 表示不连续(如节目切换或时钟重置)。 |
Random Access Indicator | 1 bit | 1 表示关键帧(随机接入/刷新点)。 |
PCR Flag | 1 bit | 1 表示包含PCR(节目时钟参考,用于同步)。 |
OPCR Flag | 1 bit | 1 表示包含OPCR(可选时钟参考)。 |
Splicing Point Flag | 1 bit | 1 表示拼接点(用于广告插入等)。 |
PCR (Program Clock Reference) | 6字节 | 时间戳(27MHz时钟,33位基值+9位扩展)。 |
Stuffing Bytes | 可变 | 填充字节(全0xFF ),用于对齐。 |
TS负载:TS包的负载,负载部分是包的主要内容,通常包含音视频数据、时间戳、同步信息等。这里就不再讲解
关于MPEGTS包头的某些重要字段:
1.同步字(Sync Byte):
TS包的第一个字节为固定的同步字(0x47)。接收方使用这个同步字来判断数据流的开始位置,确保数据传输的同步。
2.PID(Packet Identifier):
每个TS包都有一个PID,用于标识包的内容。不同类型的数据(音频、视频、字幕、控制信息等)会分配不同的PID。PID允许接收端根据PID提取特定类型的数据。
PID值(十六进制) | 用途 |
---|---|
0x0000 | PAT(Program Association Table,节目关联表。用于描述整个传输流中的节目列表,并指明各个节目对应的 PMT PID。) |
0x0001 | CAT(Conditional Access Table,条件访问表,用于管理加密内容的访问权限。它的核心作用是授权解密) |
0x0010 | PMT(Program Map Table,节目映射表。描述特定节目中音频/视频流的对应PID和类型。) |
0x0020 | 视频流(如H.264),视频编码后的数据 |
0x0021 | 音频流(如AAC),音频编码后的数据 |
NIT表的PID值通常是通过 PAT(Program Association Table) 中的 network_PID 字段动态定义而非TS包头中的PID某个固定值来指定。
一个节目可对应多个PID,但是一个PID只对应一条流。