DVB 码流中的 PCR 原理

DVB 码流中的 PCR 原理

学习 DVB 码流规范中 PCR 技术的原理。

在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值进行校准。
  • 校准过程包括以下步骤:
    1. 记录接收时间
      • 当解码端接收到一个PCR值时,记录当前本地时钟的值(STC_local)。
    2. 计算偏差
      • 计算本地时钟与PCR值之间的偏差:
        Δ = STC_local - PCR_received
        
    3. 调整本地时钟
      • 使用锁相环(PLL, Phase-Locked Loop)算法调整本地时钟,使Δ趋近于0。

动态校准

  • 解码端会根据接收到的每个PCR值动态调整本地时钟,以应对网络抖动和时钟漂移。
  • 锁相环算法的特点是平滑调整,避免频繁的时钟跳跃。

PCR与音视频同步

PTS/DTS时间戳

  • PTS(Presentation Time Stamp):指定音视频帧的显示时间。
  • DTS(Decoding Time Stamp):指定视频帧的解码时间(主要用于B帧等需要重排序的场景)。
  • PTS/DTS的时间基准来源于PCR。

同步过程

  1. 初始化
    • 解码端启动时,等待第一个PCR值,初始化本地时钟(STC)。
  2. 解码与播放
    • 音频和视频解码器根据本地时钟(STC)和PTS/DTS时间戳解码和播放内容。
    • 当STC达到某个帧的PTS值时,该帧被显示或播放。

PCR的抖动与漂移

抖动(Jitter)

  • 定义:PCR值在传输过程中因网络延迟或抖动导致的短期波动。
  • 影响:可能导致解码端时钟频繁调整,影响同步稳定性。
  • 解决方案
    • 编码端使用恒定码率(CBR)减少抖动。
    • 解码端通过缓冲和滤波算法平滑抖动。

漂移(Drift)

  • 定义:编码端与解码端时钟频率的长期差异(如晶体振荡器精度不足)。
  • 影响:长时间运行后,时钟偏差累积,导致同步失败。
  • 解决方案
    • 使用高精度晶体振荡器(如±50 ppm)。
    • 通过PCR定期校准本地时钟。

示例流程

以下是一个完整的PCR工作流程示例:

编码端

  1. 系统时钟计数到0x123456(PCR_base)时,插入PCR值到TS包。
  2. 同时为视频帧生成PTS=0x123456 + 3000(3秒后显示)。

传输

  • TS包经过卫星、有线或地面广播网络传输,可能因抖动导致延迟。

解码端

  1. 接收到PCR=0x123456,调整本地时钟STC=0x123456。
  2. 当STC达到PTS=0x123456 + 3000时,显示该视频帧。
Comment