2

我正在开发一个 directshow 音频解码器过滤器,用于解码 AC3 音频。该过滤器用于实时图,解码 TS 多播。解复用器(mainconcept)为我提供解复用的音频数据,但不提供样本的时间戳。

如何获取/计算音频的正确时间戳?

4

2 回答 2

2

我找到了这个论坛帖子:

http://www.ureader.com/msg/14712447.aspx

在其中,一个成员给出了计算音频时间戳的以下公式,给定它的格式(采样率、通道数、每个样本的位数):

对于 PCM 音频,duration_in_secs = 8 * buffer_size / wBitsPerSample / nChannels / nSamplesPerSec 或 duration_in_secs = buffer_size / nAvgBytesPerSec(因为对于 PCM 音频,nAvgBytesPerSec = wBitsPerSample * nChannels * nSamplesPerSec / 8)。

您唯一需要添加的是一个跟踪变量,它告诉您您所在的流中的样本编号,因此您可以使用它在进行线性流时将开始时间和结束时间偏移持续时间 (duration_in_secs)。对于查找操作,您当然需要知道或计算流中的样本数。

不要忘记 DirectShow 中时间戳的单位类型为 REFERENCE_TIME、长整数或 Int64。每个单位等于 100 纳秒。这就是为什么您在视频过滤器中看到值 10,000,000 除以相关的每秒帧数 (FPS) 以计算每帧的时间戳,因为 REFERENCE_TIME 变量中的 10,000,000 等于 1 秒。

于 2011-10-27T03:54:33.527 回答
1

每个 AC-3 帧都嵌入了6 * 256样本数据。采样率可以是 32 kHz、44.1 kHz 或 48 kHz(由 AC-3 规范数字音频压缩标准 (AC-3, E-AC-3)定义)。帧本身不带有时间戳,因此您需要分别假设连续流和递增时间戳。正如您提到的源是实时的,您可能需要重新调整数据匮乏的时间戳。

每个 AC-3 帧都是固定长度的(您可以从比特流标头中识别),因此您可能还会检查解复用器是否为您提供单个 AC-3 帧或一批中的几个。

于 2011-10-27T05:59:20.500 回答