TS(Transport Stream,传输流)是 MPEG-2 系统层(ISO/IEC 13818-1)定义的一种流封装格式,主要用于数字电视广播(DVB、ATSC)、IPTV 以及蓝光光盘等需要高可靠传输的场景。与面向存储的 PS(Program Stream)不同,TS 被设计为适用于易出错环境(如无线/有线传输)的复用流,具备强大的错误恢复能力、多节目复用能力以及精准的同步机制。
以下从设计哲学、包结构、复用机制、同步与时间、PS/SI 信息、工程实践等方面对 TS 格式进行全面分析。
1. TS 的设计哲学:为传输而生
TS 的设计目标是在存在误码、丢包、抖动的信道中可靠地传输多个节目(如多个电视频道)的音视频数据。其核心特点:
- 固定长度包:TS 包大小固定为 188 字节(或 192/204 字节,含附加纠错)。固定长度简化了同步与解复用器的实现。
- 独立包结构:每个包携带独立的标识(PID),即使连续丢包也不会影响后续包的解复用。
- 丰富的节目特定信息(PSI):提供节目与流之间的映射关系,支持动态切换。
- 精确的时钟恢复:通过 PCR(节目时钟参考)实现端到端的同步。
- 错误保护:可在包尾添加 RS(Reed-Solomon)纠错码(如 16 字节),形成 204 字节的包。
TS 广泛应用于数字电视、DVB、ATSC、蓝光、IPTV、HLS(作为底层流)等。
2. TS 包结构(188 字节)
每个 TS 包固定为 188 字节,包含头部(4 字节)、可选自适应字段、以及有效负载。
2.1 包头部(4 字节)
| 字段 | 长度 (bit) | 说明 |
|---|---|---|
| sync_byte | 8 | 同步字节,固定为 0x47。 |
| transport_error_indicator | 1 | 传输错误指示,置 1 表示该包至少有一个比特错误(通常由下层设置)。 |
| payload_unit_start_indicator | 1 | 有效负载起始指示。对于 PES 包,为 1 表示该包包含 PES 头;对于 PSI 表,为 1 表示该包包含表的第一个字节。 |
| transport_priority | 1 | 传输优先级(通常用于区分高优先级数据)。 |
| PID | 13 | 包标识符,唯一标识该包所属的流(如视频流、音频流、PSI 表)。 |
| transport_scrambling_control | 2 | 加扰控制(00=无加扰,01/10/11 表示不同加扰模式)。 |
| adaptation_field_control | 2 | 自适应字段控制(01=仅有效负载,10=仅自适应字段,11=两者都有)。 |
| continuity_counter | 4 | 连续性计数器,从 0 到 15 循环,用于检测丢包。 |
2.2 自适应字段(可选)
当 adaptation_field_control 为 10 或 11 时,头部后紧接自适应字段,长度可变。其主要包含:
- adaptation_field_length(1 字节):自适应字段长度(不含该字段本身)。
- PCR(节目时钟参考,6 字节):用于恢复解码器时钟,精度为 27 MHz 时钟的 90kHz 和 27MHz 部分。
- OPCR(原始节目时钟参考):用于记录原始流时间。
- splice_countdown:用于拼接(广告插入)的倒计数。
- private_data_byte:私有数据。
- stuffing_bytes:填充字节(0xFF)。
自适应字段常用于确保 PCR 精确传输,或插入填充以达到恒定码率。
2.3 有效负载
若 adaptation_field_control 为 01 或 11,头部/自适应字段后为有效负载。有效负载可以是 PES 包(承载音视频基本流)或 PSI/SI 表(节目特定信息)。
3. PES 包(Packetized Elementary Stream)
PES 是 TS 中承载基本流(视频、音频、字幕等)的结构。它将连续的基本流切分成数据块,并加上 PES 头,然后分割到连续的 TS 包中。
3.1 PES 包结构
- PES 头:包含流类型标识、PES 包长度、PTS/DTS 时间戳(可选)、数据对齐指示等。
- PES 有效负载:基本流数据(如 H.264 NAL 单元、AAC 帧)。
PTS 和 DTS 是音视频同步的关键:
- PTS(显示时间戳):指示该帧何时呈现。
- DTS(解码时间戳):指示该帧何时解码。对于 I/P 帧,PTS = DTS;对于 B 帧,DTS < PTS。
PES 包可以跨多个 TS 包传输(通过 payload_unit_start_indicator 标识起始包)。
4. PSI / SI 信息(节目特定信息与业务信息)
TS 通过 PSI 表来描述节目组成和流映射。PSI 是 MPEG-2 标准定义的必要信息;SI 是 DVB/ATSC 等广播标准扩展的信息。
4.1 主要 PSI 表
| 表名 | PID | 功能 |
|---|---|---|
| PAT(Program Association Table) | 0x0000 | 列出所有节目的 PMT PID。PAT 是解析 TS 的入口。 |
| PMT(Program Map Table) | 由 PAT 分配 | 描述一个节目包含的流(视频、音频、数据),给出各流的 PID、流类型(如 H.264、AAC)。 |
| CAT(Conditional Access Table) | 0x0001 | 提供加扰节目的授权管理信息(ECM、EMM)。 |
| NIT(Network Information Table) | DVB 定义 | 网络信息,如频点、调制参数。 |
| SDT(Service Description Table) | DVB 定义 | 服务名称、服务提供商等。 |
| EIT(Event Information Table) | DVB 定义 | 节目指南(EPG)。 |
4.2 PSI 表的传输方式
PSI 表以 section 为单位,每个 section 包含表标识、版本号、段号、数据等。section 可能跨多个 TS 包(通过 payload_unit_start_indicator 指示 section 开始)。PSI 表循环发送,以便解码器快速获取节目信息。
5. 时间与同步:PCR 与 PTS/DTS
TS 采用两层时间机制:
- 系统时钟(STC):由 PCR 恢复,频率为 27 MHz。PCR 插入在特定 TS 包的自适应字段中,提供 27 MHz 时钟的采样点。解码器锁相环(PLL)从 PCR 恢复本地时钟。
- 基本流时间:PES 头中的 PTS/DTS(90 kHz 时钟)用于同步音视频。解码器将 PTS/DTS 映射到 STC,判断何时解码和显示。
关键点:
- PCR 频率必须精确,否则会导致缓冲区上溢/下溢。
- 连续 PCR 之间的间隔不超过 100 ms(标准要求)。
6. TS 与 PS 的对比
| 特性 | TS(Transport Stream) | PS(Program Stream) |
|---|---|---|
| 包长度 | 固定 188 字节(可扩展) | 可变长度(通常 2KB 以上) |
| 错误保护 | 内置错误指示,支持 RS 纠错 | 无,依赖上层 |
| 多节目 | 支持多节目复用 | 通常单节目 |
| 随机访问 | 通过 PSI 表和 PES 头可实现 | 需要解析文件 |
| 应用场景 | 广播、流媒体、传输 | 存储、DVD、蓝光(主视频) |
| 同步 | PCR + PTS/DTS | SCR(系统时钟参考)+ PTS/DTS |
7. TS 的典型应用
7.1 数字电视广播
- DVB(欧洲)、ATSC(美国)、ISDB(日本)等标准均使用 TS 作为传输层。
- 单个 TS 可复用多个电视频道,每个频道对应一个节目(program)。
7.2 HLS(HTTP Live Streaming)
- HLS 的分片格式可以是 TS 文件(如 .ts 分片)。TS 内部通常包含 H.264 视频和 AAC 音频,通过 PMT 描述。
- 播放器下载 TS 分片后解析并播放。
7.3 IPTV 与推流
- 很多 IPTV 系统使用 UDP 承载 TS,直接在组播中传输。
- RTMP 推流时,有时会先封装为 TS 再转其他格式。
7.4 蓝光光盘
- 蓝光光盘的 M2TS 格式基于 TS,加入了额外时间戳(ATC 和 STC),用于精确播放。
8. 工程实践与工具
8.1 FFmpeg 中的 TS 处理
FFmpeg 通过 libavformat/mpegts.c 和 libavformat/mpegtsenc.c 实现 TS 的解复用和复用。
# 查看 TS 文件信息
ffprobe input.ts
# 从 MP4 转封装为 TS
ffmpeg -i input.mp4 -c copy output.ts
# 从 TS 提取视频流
ffmpeg -i input.ts -c:v copy -an video.h264
# 生成用于 HLS 的 TS 分片
ffmpeg -i input.mp4 -c copy -f hls -hls_time 10 output.m3u8
8.2 分析工具
- TS 分析工具:
tsduck(TSUtils)、dvbsnoop、tstools。 - 手动分析:使用 hexdump 查看同步字节 0x47,定位包起始。
- Wireshark:支持解析 UDP 封装的 TS 包,显示 PSI 和 PES 内容。
8.3 解析流程
- 同步:在流中搜索 0x47,然后每隔 188 字节检查同步,通常需要连续多个包正确才能确认同步。
- 读取 PID:从头部解析 PID,过滤出 PAT(PID=0x0000)。
- 解析 PAT:获取所有节目的 PMT PID。
- 解析 PMT:获取选定节目下各流(视频、音频)的 PID。
- 根据 PID 读取音视频包:收集 PES 包,提取 PTS/DTS 和基本流数据。
- 递交给解码器。
9. TS 的局限性与扩展
- 固定包大小:导致一定开销,尤其是当基本流需要填充时。
- 时间戳精度:PCR 90kHz 精度对超高清高帧率可能不够,但在广播场景已足够。
- 不支持高级编码:TS 定义时 H.264 还未普及,但通过流类型(如 0x1B = H.264, 0x24 = HEVC)可支持现代编码。
- 与 MP4 的差异:TS 适合传输,MP4 适合存储。TS 的随机访问需要解析 PSI 和 PES,而 MP4 有完整的索引表。
10. 总结
TS 作为数字电视和流媒体领域的基石,其设计充分考虑了信道误码、多节目复用和时钟同步等现实需求。固定包结构、PID 标识、PSI 表以及 PCR/PTS/DTS 三层时间体系,共同构成了一个鲁棒的传输系统。
尽管在互联网点播领域 MP4 占据主导,但 TS 在广电、IPTV、HLS 分片、专业视频传输设备中依然不可或缺。掌握 TS 格式,对于深入理解数字电视系统、流媒体封装以及编解码器的时间同步机制,都具有重要的工程价值。