在DVB(Digital Video Broadcasting)系统中,PCR(Program Clock Reference,节目参考时钟) 是一个非常重要的机制,用于确保音视频流的同步播放。它通过在传输流(TS流)中传递编码端的时钟信息,帮助解码端重建与编码端一致的时钟基准,从而实现精确的时间同步。
编码端的系统时钟
系统时钟的频率
- 编码端维护一个27 MHz 的系统时钟,这是MPEG-TS标准中规定的固定频率。
- 该时钟用于生成时间戳(如PCR、PTS/DTS),并控制音视频数据的编码和复用。
PCR的生成
- PCR是从系统时钟中提取的当前计数值,分为两部分:
- PCR_base(33位):表示以90 kHz为单位的时间基准(每计数约11.11微秒)。
- PCR_ext(9位):表示以27 MHz为单位的扩展时间(每计数约37纳秒)。
- 总时间计算公式:
PCR_time = PCR_base × 300 + PCR_ext
插入规则
- PCR被周期性地插入到TS流中,通常满足以下要求:
- 每隔最多 100 ms 插入一次(即每0.1秒至少一个PCR值)。
- 如果TS流中包含视频流,通常每个视频帧的TS包中插入一个PCR值。
PCR的结构
PCR是一个42位的字段,嵌入在TS包的适配字段(Adaptation Field) 中。其具体结构如下:
+-------------------+-------------------+
| PCR_base (33 bits)| PCR_ext (9 bits) |
+-------------------+-------------------+
- PCR_base:表示系统时钟的主计数器,范围为0 ~ 233 - 1(约26小时后溢出)。
- PCR_ext:表示系统时钟的次计数器,范围为0 ~ 29 - 1(每1/300秒循环一次)。
解码端的PCR处理
本地时钟的恢复
- 解码端使用一个27 MHz 的本地振荡器,并通过接收到的PCR值进行校准。
- 校准过程包括以下步骤:
- 记录接收时间:
- 当解码端接收到一个PCR值时,记录当前本地时钟的值(STC_local)。
- 计算偏差:
- 计算本地时钟与PCR值之间的偏差:
Δ = STC_local - PCR_received
- 计算本地时钟与PCR值之间的偏差:
- 调整本地时钟:
- 使用锁相环(PLL, Phase-Locked Loop)算法调整本地时钟,使Δ趋近于0。
- 记录接收时间:
动态校准
- 解码端会根据接收到的每个PCR值动态调整本地时钟,以应对网络抖动和时钟漂移。
- 锁相环算法的特点是平滑调整,避免频繁的时钟跳跃。
PCR与音视频同步
PTS/DTS时间戳
- PTS(Presentation Time Stamp):指定音视频帧的显示时间。
- DTS(Decoding Time Stamp):指定视频帧的解码时间(主要用于B帧等需要重排序的场景)。
- PTS/DTS的时间基准来源于PCR。
同步过程
- 初始化:
- 解码端启动时,等待第一个PCR值,初始化本地时钟(STC)。
- 解码与播放:
- 音频和视频解码器根据本地时钟(STC)和PTS/DTS时间戳解码和播放内容。
- 当STC达到某个帧的PTS值时,该帧被显示或播放。
PCR的抖动与漂移
抖动(Jitter)
- 定义:PCR值在传输过程中因网络延迟或抖动导致的短期波动。
- 影响:可能导致解码端时钟频繁调整,影响同步稳定性。
- 解决方案:
- 编码端使用恒定码率(CBR)减少抖动。
- 解码端通过缓冲和滤波算法平滑抖动。
漂移(Drift)
- 定义:编码端与解码端时钟频率的长期差异(如晶体振荡器精度不足)。
- 影响:长时间运行后,时钟偏差累积,导致同步失败。
- 解决方案:
- 使用高精度晶体振荡器(如±50 ppm)。
- 通过PCR定期校准本地时钟。
示例流程
以下是一个完整的PCR工作流程示例:
编码端
- 系统时钟计数到0x123456(PCR_base)时,插入PCR值到TS包。
- 同时为视频帧生成PTS=0x123456 + 3000(3秒后显示)。
传输
- TS包经过卫星、有线或地面广播网络传输,可能因抖动导致延迟。
解码端
- 接收到PCR=0x123456,调整本地时钟STC=0x123456。
- 当STC达到PTS=0x123456 + 3000时,显示该视频帧。