有人能给我一个简明的解释,当我有一个不暴露时钟的自定义捕获过滤器时,DirectShow DirectSound Audio Renderer将如何以及为什么会调整速率?
我根本无法理解它。当音频开始时,我指定一个零的rtStart加上样本的持续时间(numbytes / m_wfx.nAvgBytesPerSec)。然后下一个样本的开始时间是前一个样本的结束,依此类推......
一段时间后,捕获过滤器检测到Directshow过快地消耗样本,并尝试设置将来某个时间的时间戳,音频渲染器完全忽略该时间戳。作为一个测试,我可以突然告诉一个样本,它必须在未来20秒之前才能呈现(StreamTime()+ UNITS),渲染器再次忽略它。但是,Null音频渲染器会执行它所说的内容,并且整个图形会冻结20秒,这是预期的行为。
简而言之,我希望音频渲染器使用我的捕捉时钟(或它自己的,或图表,我不在乎),但我确实需要它来遵守时间戳I&#39 ;发送给它。我需要它做的是挤压或拉伸样品,巧妙地,以弥补DSound和即将来临的流(我无法控制的速率)之间的速率差异。
答案 0 :(得分:1)
MSDN在此解释了这项技术:Live Sources,我想您已经了解了这个文档主题。
当您的源处于活动状态时进行速率匹配,否则音频渲染器不需要打扰并且它希望源保持输入队列预加载数据,以便以所需的速率消耗数据。
您的过滤器似乎是实时捕获的(捕获过滤器,然后您提到您不能控制您从外部获取的数据速率)。因此,您需要确保捕获过滤器被识别为实时源,然后选择播放时钟,以及整体操作模式。我想您希望所描述的行为听取AM_PUSHSOURCECAPS_PRIVATE_CLOCK
:
源过滤器使用专用时钟生成时间戳。在这种情况下,音频渲染器将速率与时间戳匹配。
这就是你上面写的:
要了解如何进行匹配率,您需要打开音频渲染器属性页,高级页面:
Slaving Info下的数据将显示费率匹配详细信息(在我的示例中为48000/48300匹配)。数据也可通过IAMAudioRendererStats::GetStatParam
以编程方式获得。