如何从 33 位 PCR 计数生成时间戳

How to generate timestamps from the 33-bit PCR count

所以我一直在努力思考 mpeg-ts 时序和 PCR(程序时钟参考)。我知道这用于解码器的 video/audio 同步。

到目前为止我的基本理解是一切都是由一个 27 Mhz 时钟(振荡器)驱动的。该时钟以 27 Mhz 的速率循环,从 0 - 299 计数并不断重复自身。每次 "rollover" 从 299 回到 0 时,33 位 PCR 计数器就会加 1。实际上,33 位 PCR 计数器因此本身 运行 以 90 kHz 的速率.所以另一种说法是 27 Mhz 时钟除以 300,得到 90 kHz 时钟。

此 90 kHz 时钟随后用于 33 位 PCR 计数器。

我知道过去选择 90 kHz 是因为 mpeg-1 使用 90kHz 时基。 [查看来源 此处]

无论如何...我读到 PCR 33 位计数值的范围从 0x000000000 一直到 0x1FFFFFFFF。根据 this,它显示了这些值在我们人类理解的时间方面的含义(小时、分钟、秒等): 00:00:00.000 (0x000000000)26:30:43.717 (0x1FFFFFFFF)

所以最终,我的问题是关于如何将这些十六进制代码转换为那些时间戳。如果有人给我一个十六进制代码,方程式会是什么,现在我需要重现时间戳?

如有任何帮助,我将不胜感激:)

==========

我自己更接近答案了。查看从 0x000000000 到 0x1FFFFFFFF 的范围,这基本上是十进制的 0 到 8589934591。由于 PCR 时钟是 90Khz,要获得从 0 到 8589934591 所需的秒数,我们可以执行 8589934591/90000,得到 95443.71768 秒。

除非您要为卫星或地面无线电广播创建严格的比特率编码器,否则 PCR 并不重要。

场景: 您正在向没有 return 频道的无线接收器广播,接收器有一个时钟 运行,它认为每秒 90000 滴答。您的编码器也是 运行 每秒 90000 张票。您如何确定接收方和广播方对秒的定义完全相同?也许一侧 运行 有点快或慢。为了保持时钟同步,编码器偶尔会发送当前时间,这个值就是 PCR。例如,如果您以每秒 15,040,000 位的速度进行广播,则接收器每 0.0000125 秒接收一个 188 字节的数据包。编码器会不时(100 毫秒)插入其当前时间。接收器可以将这个时间与其内部时钟进行比较,并确定 运行 是否比广播编码器快或慢。为了严格保持每秒 235,000 个数据包 (15,040,000/(188*8) = 235,000),编码器将插入空数据包。在互联网上,空数据包占用带宽,没有任何价值,因此被淘汰。因此,PCR 几乎不再具有任何价值,因为它的时间不再与接收率相关。

回答你的问题。将 27hz 值设置为零,使用最近的 DTS 减去少量静态量(如 100ms),作为 90khz 值。