第三章 TS关键参数:PCR、PTS/DTS与节目时钟归纳
3.1 PCR:节目时钟参考
PCR全称Program Clock Reference,节目时钟参考。你拆开TS包时,会看到每个TS包头都有一个4字节的PID字段,但PCR并不在包头里——它藏在适配域(adaptation_field)中。说白了,PCR就是解码器用来恢复27MHz系统时钟的“基准音叉”。
我个人习惯在分析TS流时,先抓一组PCR的数值。为什么?因为PCR的精度直接决定了音视频同步能不能做好。我记得有一次项目,视频每隔几秒就卡一下,查了三天,最后发现编码器送出的PCR居然跳了5微秒的抖动,接收端锁相环根本追不上。
3.2 PTS与DTS:展示与解码的时间戳
PTS(Presentation Time Stamp)和DTS(Decoding Time Stamp)是附着在PES包里的时间标签。你想想看,视频帧有B帧这种需要双向预测的,解码顺序和显示顺序不一样,所以就得分两个时间戳来管。
- DTS:告诉解码器“现在该解这一帧了”。
- PTS:告诉显示设备“现在该显示这一帧了”。
对于没有B帧的I/P帧流,DTS和PTS完全相等。但是一旦出现B帧,DTS就得提前。我曾经在维护一个老旧复用器时,发现它的PES包只写了PTS没写DTS,结果播放器用PTS当DTS用,B帧全乱套了。
3.3 节目时钟系统:三者如何协同
解码端有一个27MHz的压控振荡器(VCXO),它不断比较本地PCR和收到的PCR差值,调整频率。当本地时钟锁定后,解码器就可以用这个稳定时钟去“校准”PTS/DTS的播放节奏。
下面这张图是我在实际项目中画的时钟关系,帮你一次性理清三个时间参数的上下游。
3.4 关键参数对比表
我把三个参数的核心差异列成一张表,方便你快速对照。
| 参数 | 全称 | 存放位置 | 单位 | 作用 |
|---|---|---|---|---|
| PCR | Program Clock Reference | TS适配域 | 27MHz周期 | 恢复编码端系统时钟 |
| PTS | Presentation Time Stamp | PES包头 | 90kHz tick | 指定显示时间点 |
| DTS | Decoding Time Stamp | PES包头 | 90kHz tick | 指定解码时间点 |
3.5 避坑指南:我踩过的三个坑
- PCR间隔过远:按照标准,PCR至少每100ms出现一次。我曾经接手一个流,PCR间隔达到300ms,解码器VCXO锁不住,画面频繁滑动。解决办法是让复用器强制插入PCR,间隔不超过40ms最稳妥。
- PTS/DTS溢出处理:33比特计数器大约可计数26.5小时。如果节目制作时间超长,PTS会回绕。解码器一般会处理回绕,但某些老芯片没做。我建议在复用器端提前做“全局时间戳补偿”,避免PTS回绕瞬间跳变。
- PCR抖动与PCR_accuracy:有些人以为PCR值准确就行了,其实PCR的到达间隔抖动更重要。我遇到过编码器CPU负载高时,PCR值明明正确,但到达间隔忽大忽小,播放器照样花屏。最好的办法是抓一个TS文件,用协议分析仪看PCR_accuracy曲线,连续抖动超过±500ns就要警惕。
3.6 实战小贴士:如何快速验证时钟同步
你用协议分析仪捕获一段TS,过滤PID为0x1FFF的空包没什么用。直接找包含PCR的PMT或PCR_PID。我个人习惯抓10秒数据,计算PCR差值,看是否在27MHz ± 30ppm范围内。然后挑一个PES包,检查PTS是否落在前一帧和后一帧的合理区间。
嗯,时间戳这块刚接触时容易绕晕,但你把PCR理解成主时钟源,PTS和DTS理解成基于这个时钟的“播放时刻表”,思路就清晰多了。实际抓包时多对比几个节目,你会发现不同编码器对PCR插入策略差异很大——有的每帧都插,有的只插I帧。这些都需要你在示波器上亲眼看看才放心。