第三章 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微秒的抖动,接收端锁相环根本追不上。

PCR的格式:占用6个字节,由33比特的PCR_base(90kHz计数器)和9比特的PCR_ext(27MHz扩展)组成。解码器重建的27MHz时钟 = PCR_base × 300 + PCR_ext。单位是27MHz的周期数。

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帧全乱套了。

注意:PTS和DTS在PES头中使用33比特表示,单位是90kHz(1/90000秒)。每个PES包不能同时包含两个时间戳?其实可以——当DTS ≠ PTS时,PES头里会同时携带两者,DTS紧跟在PTS后面。

3.3 节目时钟系统:三者如何协同

解码端有一个27MHz的压控振荡器(VCXO),它不断比较本地PCR和收到的PCR差值,调整频率。当本地时钟锁定后,解码器就可以用这个稳定时钟去“校准”PTS/DTS的播放节奏。

下面这张图是我在实际项目中画的时钟关系,帮你一次性理清三个时间参数的上下游。

PCR / PTS / DTS 时钟关系图 PCR / PTS / DTS 时钟协同关系 编码器27MHz时钟 复用器插入PCR TS传输流 解码器PLL锁相环 恢复27MHz时钟 PTS/DTS 比较输出 PCR比较反馈控制VCXO 解码器用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 避坑指南:我踩过的三个坑

  1. PCR间隔过远:按照标准,PCR至少每100ms出现一次。我曾经接手一个流,PCR间隔达到300ms,解码器VCXO锁不住,画面频繁滑动。解决办法是让复用器强制插入PCR,间隔不超过40ms最稳妥。
  2. PTS/DTS溢出处理:33比特计数器大约可计数26.5小时。如果节目制作时间超长,PTS会回绕。解码器一般会处理回绕,但某些老芯片没做。我建议在复用器端提前做“全局时间戳补偿”,避免PTS回绕瞬间跳变。
  3. 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下手,它稳了,后面才有得谈。

嗯,时间戳这块刚接触时容易绕晕,但你把PCR理解成主时钟源,PTS和DTS理解成基于这个时钟的“播放时刻表”,思路就清晰多了。实际抓包时多对比几个节目,你会发现不同编码器对PCR插入策略差异很大——有的每帧都插,有的只插I帧。这些都需要你在示波器上亲眼看看才放心。