DirectShow,特别是速率匹配,时间戳和DirectSound音频渲染器

时间:2014-10-31 22:27:21

标签: audio time directshow renderer rate

有人能给我一个简明的解释,当我有一个不暴露时钟的自定义捕获过滤器时,DirectShow DirectSound Audio Renderer将如何以及为什么会调整速率?

我根本无法理解它。当音频开始时,我指定一个零的rtStart加上样本的持续时间(numbytes / m_wfx.nAvgBytesPerSec)。然后下一个样本的开始时间是前一个样本的结束,依此类推......

一段时间后,捕获过滤器检测到Directshow过快地消耗样本,并尝试设置将来某个时间的时间戳,音频渲染器完全忽略该时间戳。作为一个测试,我可以突然告诉一个样本,它必须在未来20秒之前才能呈现(StreamTime()+ UNITS),渲染器再次忽略它。但是,Null音频渲染器会执行它所说的内容,并且整个图形会冻结20秒,这是预期的行为。

简而言之,我希望音频渲染器使用我的捕捉时钟(或它自己的,或图表,我不在乎),但我确实需要它来遵守时间戳I&#39 ;发送给它。我需要它做的是挤压或拉伸样品,巧妙地,以弥补DSound和即将来临的流(我无法控制的速率)之间的速率差异。

1 个答案:

答案 0 :(得分:1)

MSDN在此解释了这项技术:Live Sources,我想您已经了解了这个文档主题。

当您的源处于活动状态时进行速率匹配,否则音频渲染器不需要打扰并且它希望源保持输入队列预加载数据,以便以所需的速率消耗数据。

您的过滤器似乎是实时捕获的(捕获过滤器,然后您提到您不能控制您从外部获取的数据速率)。因此,您需要确保捕获过滤器被识别为实时源,然后选择播放时钟,以及整体操作模式。我想您希望所描述的行为听取AM_PUSHSOURCECAPS_PRIVATE_CLOCK

  

源过滤器使用专用时钟生成时间戳。在这种情况下,音频渲染器将速率与时间戳匹配。

这就是你上面写的:

  • 根据外部来源加盖时间戳
  • 播放正在使用音频设备时钟
  • 音频渲染器执行速率匹配以匹配费率

要了解如何进行匹配率,您需要打开音频渲染器属性页,高级页面:

Advanced Property Page

Slaving Info下的数据将显示费率匹配详细信息(在我的示例中为48000/48300匹配)。数据也可通过IAMAudioRendererStats::GetStatParam以编程方式获得。