【发布时间】:2017-04-15 04:03:01
【问题描述】:
我正在创建一个显示一些图形内容的程序,并使用 DirectShow 使用网络摄像头记录观看者的面部。知道屏幕上显示的内容与网络摄像头记录帧之间的时间差非常重要。
我根本不关心减少延迟或类似的事情,它可以是任何东西,但我需要尽可能准确地了解捕获延迟。
当帧进入时,我可以get the stream times 的帧,但所有这些帧相对 到某个特定的流开始时间。 我如何访问捕获设备的流开始时间?该值显然在 directshow 的某个地方,因为过滤器图会为每一帧计算它,但我怎样才能得到它呢?我已经搜索了文档,但还没有发现它是秘密的。
我创建了我自己的 IBaseFilter IReferenceClock 实现类,它只报告大量调试信息。这些似乎在做他们需要做的事情,但他们没有提供足够的信息。
对于它的价值,我试图通过检查 DirectShow 事件队列来对此进行调查,但似乎没有触发有关过滤器图启动的事件,即使我启动了图表。
使用测试应用记录的以下图像可能有助于理解我在做什么。现在的图形内容只是一个计时秒数。 网络摄像头正在录制屏幕。在捕获该帧的特定时刻,系统时间约为 1.35 秒左右。 DirectShow中录制的样本时间为1.1862秒(忽略图片中的标题)。 我如何解释本例中 0.1637 秒的差异?流开始时间是推导该值的关键。
系统时钟和参考时钟都在使用 QueryPerformanceCounter() 函数,所以我不认为它是计时器错误。
谢谢。
【问题讨论】:
标签: c++ video webcam directshow