我正在开发一个源过滤器,它通过DirectShow图形为我们的软件捕获的视频/音频提供数据。我让视频相对轻松地工作,但我现在尝试添加一个音频输出引脚被证明是一个相当大的挑战。我的具体问题是:音频渲染器在播放声音时是否会修改实际的参考时钟?
我看到视频播放很不稳定。下面是一段日志文件,看起来参考时钟偶尔会“停止”,而系统时间却一直在滴答作响。这有意义吗?
我应该提到的一件事是,音频样本是u-Law8 kHz 8比特,每个包恰好是120毫秒。这里是复杂的:当我们从网络接收音频数据时,它没有时间信息,所以我们的软件在接收数据包的时间分配了一个样本时间戳。视频样本由原始源标记,因此它们是准确的。如果我忽略音频采样时间,简单地分配间隔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
发布于 2010-10-19 14:31:45
当声卡在图形中时,通常选择它作为参考时钟。其他滤镜,包括视频渲染器,使用它来确定何时显示其采样。并行使用系统时钟不是一个好主意;您应该使用相同的参考时钟来进行同步。
如果您知道音频样本的实际长度,并且您确定不会丢失其中的任何一个(例如,您使用TCP,而不是UDP),那么分配连续的120毫秒的时间间隔是一个很好的解决方案。当样本从网络到达时,从系统时钟中获取时间戳不是一个好主意,因为它会引入由网络行为引起的随机时移-您永远不会真正知道网络数据包需要多长时间才能到达。
如果你有两个过滤器,并想看看它们的时间有什么不同,你可以安装GraphEditPlus,在你的过滤器之前/之后插入一个样本抓取器,右键单击它,然后选择“查看抓取的样本”。它将显示所有的时间戳和其他信息。此外,您还可以右键单击图形窗口并选择“查看事件日志”。它也可以提供帮助。
发布于 2013-03-16 00:23:49
要了解图形中的哪个时钟用作参考时钟,并查看此时钟相对于本地CPU时钟的漂移(通过QueryPerformanceCounter),请查看DirectShow filter 。
https://stackoverflow.com/questions/3885318
复制相似问题