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

Audio DirectShow,特别是速率匹配、时间戳和DirectSound音频渲染器,audio,time,directshow,renderer,rate,Audio,Time,Directshow,Renderer,Rate,有谁能给我一个简洁的解释,当我有我的自定义捕获过滤器,但不公开时钟时,DirectShow DirectSound音频渲染器将如何以及为什么调整速率 我完全搞不懂。当音频启动时,我将rtStart赋值为零加上采样的持续时间(numbytes/m_wfx.nAvgBytesPerSec)。然后下一个样本的开始时间是上一个样本的结束时间,依此类推 一段时间后,捕获过滤器会检测到Directshow消耗样本的速度过快,并尝试设置未来某个时间的时间戳,而音频渲染器会完全忽略该时间戳。作为一个测试,我可以

有谁能给我一个简洁的解释,当我有我的自定义捕获过滤器,但不公开时钟时,DirectShow DirectSound音频渲染器将如何以及为什么调整速率

我完全搞不懂。当音频启动时,我将rtStart赋值为零加上采样的持续时间(numbytes/m_wfx.nAvgBytesPerSec)。然后下一个样本的开始时间是上一个样本的结束时间,依此类推

一段时间后,捕获过滤器会检测到Directshow消耗样本的速度过快,并尝试设置未来某个时间的时间戳,而音频渲染器会完全忽略该时间戳。作为一个测试,我可以突然告诉一个示例,它必须在未来20秒(StreamTime()+单位)后才能渲染,渲染器再次忽略它。但是,空音频渲染器会按指示执行,整个图形会冻结20秒,这是预期的行为


简而言之,我希望音频渲染器使用我的捕获时钟(或者它自己的,或者图形的,我不在乎),但我确实需要它遵守我发送给它的时间戳。我需要它做的是压扁或拉伸样本,非常微妙,以弥补DSound和迎面而来的流(其速率我无法控制)之间的速率差异。

MSDN在这里解释了这项技术:,我想您已经知道这个文档主题了

速率匹配发生在源处于活动状态时,否则音频渲染器不需要麻烦,它希望源保持输入队列预加载数据,以便以所需的速率消耗数据

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

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

这就是你在上面写的内容:

  • 您可以根据外部源设置时间戳
  • 播放使用音频设备时钟
  • 音频渲染器进行速率匹配以匹配速率
要查看速率匹配的精确方式,您需要打开音频渲染器属性页,高级页:


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

你好,罗曼——我确实在做am_PUSHSOURCECAPS_PRIVATE_时钟的事情,并通过QI将时钟曝光。在渲染器统计信息中,我观察到,slaving信息显示“livetimestamps”,并且仅位于(我假设的是44100 sr:44713的最大速度。因此渲染器认为速率太快,我不知道为什么!我不明白的是您观察到的效果是什么。速率匹配-您可能认为是不正确的-它是否最终在播放缓冲区中运行不足?溢出?检查将样本调度到未来的20秒。)ure是可以理解的:当启用速率匹配并且它将源视为活动数据时,那么就不会有来自未来的数据,只有活动数据。因此,这个时间戳被忽略,或者它重置了内部匹配计数器。这使我们的自我转向:我试图太聪明了:当流以静默开始时填充涌入的样本——当然是ev这之后的每个示例都是“迟来的”,因此渲染器完全运行(结果大约是44370)。这是一种简单地问问题就可以帮助我更清楚地了解自己在做什么的情况!对于一个人的商店来说,这是一个大问题;没有人可以提出问题!