简介:这是一款面向数字电视(DTV)开发与测试人员的 TS 码流分析工具,以树形结构直观展示 PAT、PMT、SDT、EIT 等 PSI/SI 表以及 Subtitle 的 PES 包,并且额外解析了 LCN 和字幕数据,支持字幕图片仿真、搜台过程模拟、EPG 仿真以及将解析结果导出为网页格式,便于对比学习 TS 结构。压缩包共 30 个文件,rar 格式,大小仅 161KB,内含可执行 exe、网页展示用的 js/html、界面图标 gif 以及示例数据库 db 和源码 c 文件,轻量但功能齐全。目前已有 1909 人学习下载,特别适合刚接触 DTV 协议的新人快速上手,也适合工程师排查码流问题时参考。工具还支持双击 EIT 事件查看详情、导出 PAT/PMT/SDT/NIT 为网页,虽然当前是演示版,但能帮助读者从实例中理解 TS 数据组织方式。 做数字电视、视频编解码或者流媒体开发的同行,应该都体会过对着一段原始码流发懵的感觉:满屏十六进制,全是0x47开头的数据块,乍一看像乱码,但里面其实藏着一整套音视频编排逻辑。我自己刚接触TS结构时,就是靠码流分析软件(ts analysis tool)一点点把每一字节的含义啃下来的。市面上这类工具不少,但能把TS包、PAT、PMT、PES、PTS这些抽象概念变成可视化界面,让人拖一拖、点一点就能看清结构的,确实是学习阶段最值得装的一个工具。
这篇内容写给刚入行或正在做播放器、流媒体服务、数字电视终端的开发同学,也适合运维排查时手里缺工具的现场工程师。我会从TS流为什么难懂讲起,再到工具的实际操作,最后把常见问题排查的经验一并整理出来,保证你照着走一遍就能上手。
1. 先理解TS流为什么劝退新人
1.1 一串188字节的“集装箱”看起来都一样
TS流(Transport Stream,传输流)属于MPEG-2系统层封装格式,它的最大特点是把音视频数据切成固定长度的小包,每包正好188字节。这个封装方式在数字电视、卫星广播、DVB、ATSC里几乎无处不在,网络视频打包成TS分片(比如HLS切片)也是同一个套路。
问题就在于:每个TS包的开头都是固定同步字节0x47,没有明显边界,打开原始文件后满屏都是0x47,很难直接定位某一段是视频还是音频,更别说去判断关键帧和音画同步信息了。我最早拿十六进制编辑器一帧一帧翻包,翻了半天,发现PID、连续计数这些字段在多个包之间是相互关联的,靠肉眼根本拼不出完整逻辑。这也是为什么需要一个专门解析TS结构的工具,而不是用通用十六进制查看器硬啃。
1.2 工具的作用:把“字节关系”变成“可视化结构”
码流分析软件的核心价值不只是把TS包按字段翻译成文字,而是把包与包之间的关联关系做出来。简单说,它能告诉你:这一段码流的节目信息表在哪里、里面包含哪几路视频和音频、各路流的PID是多少、PES包从哪个TS包开始、PTS和DTS是多少、PCR抖动大不大,诸如此类。
掌握TS结构,本质上不是去背几十个字段的定义,而是理解“PSI/SI表怎么引导解码器找到数据”、“PES封装怎么从TS包恢复原始流”、“PTS/DTS怎么保证音画同步”这三层关系。工具如果能把这几个层次分别展示出来,学习效率会高很多,排查问题时也能直接定位到是哪一层出了问题。接下来我按照实际使用顺序,从准备码流文件到工具的基本操作,再到逐层解析,一步步来讲。
2. 准备一段码流,并跑通ts analysis tool
2.1 从哪里找“水不太深”的TS文件
练手阶段不建议一开始就去解析复杂的卫星转播码流,最好先从自己能控制的文件开始。我个人常用的几个来源:
- 用编码器或FFmpeg生成一段测试TS文件,比如编码一个包含H.264视频和AAC音频的短片段,码率不要太高,1Mbps左右就够;
- 从网上找公开的MPEG-TS样本文件,比如一些开源播放器仓库里自带的测试流;
- 如果是做数字电视相关项目,可以直接从复用器或者码流发生器导出文件;
- 也可以直接在命令行用ffmpeg把一段MP4转成TS:
ffmpeg -i input.mp4 -c copy output.ts,原音视频不重新编码,速度快,结构也干净。
拿到文件后,先看文件大小。别一上来就拉几十GB的大文件,几百MB以内足够练习和排错。我一般会先用工具跑一个“快速扫描”,确认全文件同步字节正确率,如果0x47出现位置错位率很高,多半是抓流时丢包了,这种文件不适合用来学习接口格式。
2.2 码流分析工具的基本工作方式
ts analysis tool这一类软件通常提供两种形态:图形界面版和命令行版。图形界面版适合学习阶段,因为它会把TS包逐个列出来,并高亮显示同步字节、PID、适配字段、负载起始位置等关键信息;命令行版适合自动化批处理,比如写脚本做码流质量检查。
打开软件后,常见的第一步是加载TS文件,工具会自动扫描包同步,并统计每个PID出现的包数量。这个界面一般会显示一个PID维度的大盘,你会看到表格里列出:PID号、流类型、包数量、是否包含PES、是否有PCR,这样基本一眼就能看出这路码流是怎么组织的。
实际操作时,我的习惯是三步走:先看整体统计,确认有没有明显异常;再双击具体PID进去看包的原始内容和结构解析;最后切到PSI表视图,检查PAT、PMT等表信息是否完整。下面几个章节就按这个顺序展开。
3. 从工具界面反推TS包结构
3.1 先认识TS包的固定头4字节
TS包是188字节固定长度,起始4字节是包头部,字段分布如下:
| 字段 | 长度 | 说明 |
|---|---|---|
| sync_byte | 8bit | 固定0x47,用于同步识别 |
| transport_error_indicator | 1bit | 传输错误标记,1表示当前包可能有错 |
| payload_unit_start_indicator | 1bit | 1表示当前包负载是一个PES或PSI表的起始 |
| transport_priority | 1bit | 优先级标记 |
| PID | 13bit | 包标识,0x0000是PAT,0x0001是CAT,0x1FFF是空包 |
| transport_scrambling_control | 2bit | 加扰控制,00表示未加扰 |
| adaptation_field_control | 2bit | 01表示仅负载,10表示仅适配字段,11表示两者都有 |
| continuity_counter | 4bit | 连续计数器,用于检测丢包 |
在工具里点开任意一个包,这些字段会逐一展示。我特别建议新手做一件事:用工具的“搜索/过滤功能”只看同步字节位置是否正确,然后手动数一数相邻两个0x47之间的字节数是不是188。只有对“固定长度”这件事有身体记忆,后面理解PES切包才不会懵。
3.2 适配字段:不是所有包都直接装音视频数据
很多TS包的首部之后会跟着一个adaptation_field(适配字段),里面藏着PCR等关键信息。PCR即节目时钟基准,是解码器恢复27MHz时钟的依据,在TS回放和录制中非常重要。
适配字段的结构大概是:adaptation_field_length表示长度,接着是各种标志位,如果PCR_flag为1,后面会有6字节的PCR基值和扩展值。PCR的计算公式是PCR = 基值 * 300 + 扩展值,单位为27MHz时钟周期。这个参数我建议在工具里找到PCR所在包,观察连续几个PCR值的变化。
如果PCR间隔过大或抖动明显,接收端解码器的时钟就容易漂移,表现就是声音和画面逐渐不同步。我在实际项目里遇到过录播文件播放一段时间后音画差距越来越大,查到最后就是复用器写PCR的间隔太长,靠码流分析软件的PCR图表一眼就定位了。
3.3 PSI表结构:PAT和PMT如何引导出音视频PID
TS流里最核心的导航数据是PSI(Program Specific Information),入门阶段只需要重点掌握PAT和PMT。
PAT(Program Association Table)固定使用PID 0x0000,它的作用是告诉解码器“当前码流里有哪几个节目,每个节目的PMT在哪个PID上”。工具里打开PAT视图,通常能看到program_number和对应的PMT PID列表。
PMT(Program Map Table)则进一步描述一个节目包含哪些基本流,例如视频流的PID、音频流的PID,以及各自的stream_type(0x1B通常是H.264,0x0F是AAC音频,0x24是HEVC,0x06可以表示私有数据或字幕)。一个节目可能有多路视频(比如主视频和画中画)、多路音频(比如多语言)、多路字幕,PMT里都会分别列出来。
排查问题时,最典型的场景是:播放器黑屏但有声音,或者只有画面没声音。这时候用工具的PMT面板一查,往往能发现音频PID不对、stream_type写错,或者PMT表本身CRC错误。工具的价值在这里体现得最直接。
4. 用ts analysis tool逐层拆解一段真实码流
4.1 第一步:总体统计判断码流是否“健康”
加载TS文件后,不要急着看具体包,先看概览。工具一般会给出几个关键指标:
- 文件总包数、总时长估算;
- PID种类及每个PID的包数量分布;
- 同步字节错误数量;
- continuity_counter跳变次数;
- PCR/PTS/DTS的最小、最大、平均间隔。
我判断一段码流是否健康,通常先看continuity_counter跳变。每个TS包都有一个4bit的连续计数器,同一PID的包之间计数应该按0到15循环递增,如果中间跳数,说明这个PID的包有丢失。比如视频PID的计数器从5直接跳到8,中间少了6、7两个包,那播放时大概率会花屏或马赛克。
这个阶段也能顺便发现是否存在空包(PID 0x1FFF)。空包占比过高说明复用器填充了很多空数据,文件偏大但有效码率不高,这在抓流分析时容易让人误判。
4.2 第二步:从PAT出发,追踪PMT和音视频PID
拿到整体统计后,第二步是切到PSI表视图,按层逐步点开:
- 先看PAT,确认有节目,并记下PMT PID;
- 再看PMT,确定视频PID、音频PID和各自的stream_type;
- 在“PID过滤”里输入视频PID,查看视频PES包的起始位置和包列表;
- 再输入音频PID,同样确认音频PES分布。
这一步我会特别关注payload_unit_start_indicator为1的包,因为它代表一个新PES包或PSI分段从这里开始。通俗理解,一个PES包可能被打在多个TS包里,只有第一个TS包的payload_unit_start_indicator是1,后面跟着的包都是同一PES的延续。工具会把这个“首包”到“末包”的范围高亮出来,你可以直观看到一段视频帧数据是怎么被切分成好几个188字节包的。
音频和视频的PES包大小差异很大,视频I帧的PES可能有好几KB,音频一帧的PES往往只有几百字节甚至更少。这不是异常,而是编码特性决定的,不用慌。
4.3 第三步:深挖PES头里的PTS/DTS和语法标识
在工具中双击任意一个视频PES包,能看到PES头的详细解析。PES头典型字段包括:
- packet_start_code_prefix:固定3字节0x000001;
- stream_id:识别流类型,视频通常0xE0,音频通常是0xC0~0xDF;
- PES_packet_length:PES包长度;
- PTS_DTS_flags:后面是否携带PTS或DTS;
- PTS/DTS:各占33bit,使用90kHz时钟刻度,实际显示时间需要除以90000换算成秒。
PTS和DTS对判断音画同步非常关键。简单理解,PTS是“什么时候该显示这一帧”,DTS是“什么时候该解码这一帧”。在有B帧的视频里,解码顺序和显示顺序不一致,所以DTS往往比PTS早,工具会给你画出两个时间轴,能直观看到每帧的解码与显示间隔。
假如发现某一路视频流的PTS出现大跳变,或者相邻两个PES包的时间戳差值远超一帧时长,通常意味着原始流存在丢帧、跳帧,或者复用器写入时间戳时计算有误。这类问题如果不借助工具逐帧比对,光靠播放器表现很难定位。
4.4 附:用命令行方式快速提取关键信息
如果图形界面不够方便,很多ts analysis tool也提供命令行模式,适合排查时快速跑结论。例如:
tsanalysis -i input.ts --pid-stats tsanalysis -i input.ts --psi-info tsanalysis -i input.ts --pcr-jitter我平时写自动化巡检脚本时,会直接调用命令行工具输出PID统计和PCR抖动值,再把结果接入监控平台。图形界面的优势则是交互友好,适合学习结构和临时排查,两者可以搭配使用。
5. 常见问题与排查技巧实录
5.1 常见TS流异常对照表
| 现象 | 可能原因 | 工具中如何确认 |
|---|---|---|
| 播放黑屏 | PAT缺失或PMT PID错误,找不到视频流 | 查看PSI信息,确认真实节目号是否与PMT一致 |
| 有画面无声音 | 音频PID丢失或stream_type配置错误 | 在PMT中检查音频PID是否存在于PID统计列表 |
| 花屏、马赛克 | 视频PID包丢失,continuity_counter跳变 | 按PID过滤,观察计数器连续性 |
| 音画不同步 | PCR抖动过大,或PTS/DTS复位异常 | 查看PCR图表和PTS/DTS时间轴 |
| 播放卡顿 | 空包占比过高或有效码率不稳定 | 查看空包PID 0x1FFF占比和瞬时码率曲线 |
| 字幕不显示 | PMT中缺少字幕流描述或stream_type不支持 | 查看PMT中私有流描述与字幕PID |
这张表是我实际排查中整理出来的,不一定覆盖所有情况,但基本流程是通用的:先确认同步,再看PID统计,然后检查PSI表,最后比对时间戳。顺着这个链路走,绝大多数TS层面的问题都能锁定。
5.2 现场排查的三个心得
第一,拿到问题码流后,别急着看具体包,先看全局统计。我见过不少同事直接跳到某个PID里翻包,翻半天也看不出问题,因为丢包、PID冲突这类问题在全局统计里就是一眼的事。
第二,过滤PID时留意空包和PCR。PCR只在适配字段里出现,不是每个包都有,工具里一般有专门的PCR筛选功能。如果PCR间隔过大,播放端缓冲就容易出问题,这在自适应码率切换和录制回放里尤其明显。
第三,在分析录制文件时,注意抓文件本身是否完整。有些问题不是码流真的坏了,而是抓包环节丢帧导致文件损坏。判断方法很简单:看同步字节错误率,如果大量0x47错位,那就要重新抓取原始码流。
6. 最后再分享一点我的个人用法
我用码流分析软件最频繁的阶段,不是做大项目时,反而是刚开始研究TS结构那段时间。那时候每天啃协议文档,看文字理解不了的东西,拿工具把真实码流一层层剥开,很快就通了。后来做播放器兼容性适配,遇到厂商反馈的疑难问题,也都是先用工具复现、定位到PID和PTS层级,再去和协议栈的人沟通,效率比盲猜高得多。
如果看完这篇也想自己动手,我建议你按这个顺序练习:先拿FFmpeg生成一段30秒左右的TS文件,载入工具后找出PAT和PMT的PID,再分别过滤出视频和音频的PES包,观察PTS/DTS的关系,最后把PCR和相关参数的时间线截图保存下来,作为后续对照参考。等这一套流程走熟了,TS结构里那些看起来复杂的细节,其实也就没那么神秘了。
本文还有配套的精品资源,点击获取