gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 23:12:51 25 4
gpt4 key购买 nike

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

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

一段时间后,捕获过滤器感知到 Directshow 消耗样本的速度过快,并尝试设置 future 某个时间的时间戳,音频渲染器完全忽略了该时间戳。作为测试,我可以突然告诉一个样本,它必须在 future 20 秒后才能渲染(StreamTime() + UNITS),然后渲染器再次忽略它。但是,Null Audio Renderer 会按照它的指示进行操作,整个图表会卡住 20 秒,这是预期的行为。

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

最佳答案

MSDN 在此解释该技术:Live Sources ,我想你知道这个文档主题。

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

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

the source filter is using a private clock to generate time stamps. In this case, the audio renderer matches rates against the time stamps.



这就是您在上面写的内容:
  • 您根据外部来源的时间戳
  • 播放正在使用音频设备时钟
  • 音频渲染器进行速率匹配以匹配速率

  • 要查看精确的速率匹配是如何发生的,您需要打开音频渲染器属性页面,高级页面:

    Advanced Property Page

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

    关于audio - DirectShow,特别是速率匹配、时间戳和 DirectSound 音频渲染器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26684330/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com