【问题标题】:DirectShow, specifically Rate Matching, time stamps and the DirectSound Audio RendererDirectShow,特别是速率匹配、时间戳和 DirectSound 音频渲染器
【发布时间】:2014-10-31 22:27:20
【问题描述】:

谁能简要解释一下当我的自定义捕获过滤器不显示时钟时,DirectShow DirectSound Audio Renderer 如何以及为什么会调整速率?

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

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

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

【问题讨论】:

    标签: audio time directshow renderer rate


    【解决方案1】:

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

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

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

    源过滤器正在使用私有时钟来生成时间戳。在这种情况下,音频渲染器会将速率与时间戳进行匹配。

    这就是你在上面写的:

    • 您根据外部来源的时间戳
    • 播放正在使用音频设备时钟
    • 音频渲染器会进行速率匹配以匹配速率

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

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

    【讨论】:

    • 你好 Roman -- 我确实在做 AM_PUSHSOURCECAPS_PRIVATE_CLOCK 事情并通过 QI 暴露时钟。在渲染器统计信息中,我观察到从属信息显示“实时时间戳”并且只是位于(我认为是 44100 sr 的最大速度:44713。所以渲染器认为速度太快了,而我没有知道为什么!
    • 我不明白的是你观察到的效果是什么。速率匹配 - 您可能认为它不正确 - 它最终会导致播放缓冲区欠载吗?超限?将样本安排到未来 20 秒的检查是可以理解的:当启用速率匹配并将源视为实时时,则不会有来自未来的数据,只有实时数据。所以这个时间戳被忽略或者它重置内部匹配计数器。
    • 它变成了我自己:我试图太聪明了:当流以沉默开始时填充样本的涌入——当然,之后的每个样本都是“迟到的”,所以渲染器运行正常(结果大约是 44370)。这是其中一种情况,只需提出问题就可以帮助我更清楚自己在做什么!对于一个人的商店来说,这是一个大问题;没有人可以提出问题!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-13
    相关资源
    最近更新 更多