在directshow图中设置音频样本的时间戳

时间:2011-02-23 17:16:37

标签: audio directshow live-streaming timestamp mpeg-2

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

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

2 个答案:

答案 0 :(得分: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)来计算每帧的时间戳,因为10,000,000等于REFERENCE_TIME变量中的1秒。

答案 1 :(得分:1)

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

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