【问题标题】:How to generate timestamps from the 33-bit PCR count如何从 33 位 PCR 计数生成时间戳
【发布时间】:2025-12-24 16:00:17
【问题描述】:

所以我一直试图围绕 mpeg-ts 计时和 PCR(程序时钟参考)。我知道这是用于解码器的视频/音频同步。

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

然后将这个 90 kHz 时钟用于 33 位 PCR 计数器。

我了解历史上选择 90 kHz 是因为 mpeg-1 使用 90 kHz 时基。 [见源here]

无论如何...我已经读到 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 秒。

【问题讨论】:

  • 这不是一个“十六进制代码”,它只是一个数字。您选择在第 16 节中表示它。您也可以将其键入为小数。

标签: mpeg2-ts


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢,那里有很多有用的信息!我想我想知道的是 1)这些十六进制代码是什么意思?2)这如何帮助生成 PTS 和 DTS。例如 00:00:00:2600 (Hour:Min:Sec) 的 PTS...它是如何从十六进制格式转换为这种格式的?
  • 十六进制没有任何意义。它只是一个 33 位整数的最小值和最大值。
  • 要转换为秒,在这种情况下,将时间戳除以时基 90000。