DirectSound音频渲染器与参考时钟的行为
我正在处理一个源过滤器,该源过滤器通过DirectShow图提供由我们的软件捕获的视频/音频。我的视频工作比较轻松,但我现在试图增加一个音频输出引脚被证明是一个相当大的挑战。我的具体问题是:音频渲染器在播放声音时是否修改实际参考时钟?DirectSound音频渲染器与参考时钟的行为
我看到非常生涩的视频播放。下面附加的是一个日志文件的块,它看起来像在偶尔参考时钟刚刚“停止”,而系统时间保持滴答。那有意义吗?
我应该提及的一件事是音频采样是u-Law 8 kHz 8位,每个数据包恰好为120 ms。这是一个复杂的问题:当我们从网络接收音频数据时,它没有附带时间信息,所以我们的软件在收到数据包时指定一个采样时间戳。视频样本由原始来源加盖,因此它们是准确的。如果我忽略音频采样时间并简单地分配采样时间戳120分钟,则视频将平稳播放。问题是我还没有完全理解参考时钟和音频/视频渲染器之间的完整关系,真正令我困惑的是我们有另一个类似的源滤波器,它可以播放相同的数据而不会产生抖动视频(它没有日志记录,并且我没有机会添加任何以查看在这种情况下参考时钟是否也被修改)。
这是一块的日志:
Sys Clock (delta) StreamTime (delta) Drift between clocks:
------------------------------------------------------------------
15:54:40.755 (0.005) 1.838 (0.005) 0.000
15:54:40.761 (0.006) 1.844 (0.006) 0.000
15:54:40.889 (0.128) 1.972 (0.128) 0.000
15:54:40.894 (0.005) 1.977 (0.005) 0.000
15:54:40.899 (0.005) 1.982 (0.005) 0.000
15:54:40.903 (0.004) 1.986 (0.004) 0.000
15:54:40.931 (0.028) 2.014 (0.028) 0.000
15:54:40.936 (0.005) 2.019 (0.005) 0.000
15:54:41.019 (0.083) 2.080 (0.061) 0.022
15:54:41.175 (0.156) 2.080 (0.000) 0.178
15:54:41.181 (0.006) 2.080 (0.000) 0.184
15:54:41.190 (0.009) 2.080 (0.000) 0.193
15:54:41.197 (0.007) 2.080 (0.000) 0.200
15:54:41.202 (0.005) 2.080 (0.000) 0.205
15:54:41.210 (0.008) 2.080 (0.000) 0.213
15:54:41.216 (0.006) 2.080 (0.000) 0.219
15:54:41.220 (0.004) 2.080 (0.000) 0.223
15:54:41.313 (0.093) 2.080 (0.000) 0.316
15:54:41.317 (0.004) 2.080 (0.000) 0.320
15:54:41.408 (0.091) 2.116 (0.036) 0.375
15:54:41.412 (0.004) 2.120 (0.004) 0.375
15:54:41.432 (0.020) 2.140 (0.020) 0.375
15:54:41.436 (0.004) 2.144 (0.004) 0.375
15:54:41.439 (0.003) 2.147 (0.003) 0.375
当声卡是在图中它通常选择为参考时钟。其他过滤器(包括视频渲染器)使用它来确定何时显示其样本。并行使用系统时钟不是一个好主意,你应该使用相同的参考时钟进行同步。
如果您知道音频样本的实际长度,并且您确定不会丢失任何音频样本(例如,您使用TCP而不是UDP),那么只需分配连续的120个时间间隔即可好的解决方案从网络获取样本时,从系统时钟获取时间戳是一个坏主意,因为它会引入由网络行为引起的随机时间偏移 - 您永远不知道网络数据包需要多长时间。
如果您有两个过滤器并希望了解它们的时间安排有何不同,您可以安装GraphEditPlus,在过滤器之前/之后插入采样器,右键单击并选择“手表抓取样品”。它会显示所有的时间戳和其他信息。此外,您可以右键单击图形窗口并选择“查看事件日志”。它也可以提供帮助。
为了了解哪个时钟在图表被用作基准时钟,并看到该时钟相对于本地CPU时钟(经由QueryPerformanceCounter的)的漂移,检查出DirectShow过滤器ShowClk.ax。
问题是“QueryPerformanceCounter”本身不准确。 – 2013-03-15 20:20:42
谢谢你的回复。但是,这实际上并没有回答我试图找出的问题,即“音频渲染器在播放声音时是否修改实际参考时钟”。 – DXM 2010-10-20 17:17:04
现在,我只是想了解DirectShow及其行为。如果特定时间段的音频样本的参考时间间隔与该时间段不匹配,它会做什么?必须提供一些东西,但除非重新采样音频,否则其播放时间永远不会改变。那么在这种情况下,音频渲染器会调整参考时钟值以与正在播放的样本的参考时间相匹配(这会明显改变视频渲染器的播放)?这是我看到的,但现在只与我正在使用的两个源过滤器之一。 – DXM 2010-10-20 17:26:21
您提到的解决方案是我正在考虑的方法之一,但在我的特定情况下会更复杂一点,因为当我的软件从不同设备收集视频/音频数据时,每个设备都有自己的时钟,它永远不会运行率作为个人电脑。这就是为什么所有东西都需要根据系统时钟进行标准化(以不引入抖动的方式),所以我可能最终不得不重新采样音频流(或者引入类似于VoIP用来伸展/缩短音频流的东西流)。 – DXM 2010-10-20 17:29:05