TS 格式分析 笔记

3 阅读8分钟

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_byte8同步字节,固定为 0x47
transport_error_indicator1传输错误指示,置 1 表示该包至少有一个比特错误(通常由下层设置)。
payload_unit_start_indicator1有效负载起始指示。对于 PES 包,为 1 表示该包包含 PES 头;对于 PSI 表,为 1 表示该包包含表的第一个字节。
transport_priority1传输优先级(通常用于区分高优先级数据)。
PID13包标识符,唯一标识该包所属的流(如视频流、音频流、PSI 表)。
transport_scrambling_control2加扰控制(00=无加扰,01/10/11 表示不同加扰模式)。
adaptation_field_control2自适应字段控制(01=仅有效负载,10=仅自适应字段,11=两者都有)。
continuity_counter4连续性计数器,从 0 到 15 循环,用于检测丢包。

2.2 自适应字段(可选)

adaptation_field_control1011 时,头部后紧接自适应字段,长度可变。其主要包含:

  • adaptation_field_length(1 字节):自适应字段长度(不含该字段本身)。
  • PCR(节目时钟参考,6 字节):用于恢复解码器时钟,精度为 27 MHz 时钟的 90kHz 和 27MHz 部分。
  • OPCR(原始节目时钟参考):用于记录原始流时间。
  • splice_countdown:用于拼接(广告插入)的倒计数。
  • private_data_byte:私有数据。
  • stuffing_bytes:填充字节(0xFF)。

自适应字段常用于确保 PCR 精确传输,或插入填充以达到恒定码率。

2.3 有效负载

adaptation_field_control0111,头部/自适应字段后为有效负载。有效负载可以是 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 采用两层时间机制:

  1. 系统时钟(STC):由 PCR 恢复,频率为 27 MHz。PCR 插入在特定 TS 包的自适应字段中,提供 27 MHz 时钟的采样点。解码器锁相环(PLL)从 PCR 恢复本地时钟。
  2. 基本流时间: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/DTSSCR(系统时钟参考)+ 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.clibavformat/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)、dvbsnooptstools
  • 手动分析:使用 hexdump 查看同步字节 0x47,定位包起始。
  • Wireshark:支持解析 UDP 封装的 TS 包,显示 PSI 和 PES 内容。

8.3 解析流程

  1. 同步:在流中搜索 0x47,然后每隔 188 字节检查同步,通常需要连续多个包正确才能确认同步。
  2. 读取 PID:从头部解析 PID,过滤出 PAT(PID=0x0000)。
  3. 解析 PAT:获取所有节目的 PMT PID。
  4. 解析 PMT:获取选定节目下各流(视频、音频)的 PID。
  5. 根据 PID 读取音视频包:收集 PES 包,提取 PTS/DTS 和基本流数据。
  6. 递交给解码器

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 格式,对于深入理解数字电视系统、流媒体封装以及编解码器的时间同步机制,都具有重要的工程价值。