首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DirectShow:如何将视频采集设备的流时间与系统时间同步

DirectShow:如何将视频采集设备的流时间与系统时间同步
EN

Stack Overflow用户
提问于 2017-04-15 04:03:01
回答 2查看 872关注 0票数 1

我正在创建一个程序,在其中我显示一些图形内容,我记录了观众的脸与摄像头使用DirectShow。这是非常重要的,我知道什么是在屏幕上的时间差时,摄像头记录的帧。

我根本不在乎减少延迟或诸如此类的事情,它可以是什么,但我需要尽可能准确地知道捕获延迟

当帧进入时,我可以获取流时间的帧,但所有这些帧是相对于某些特定的流启动时间。如何访问流启动时间,用于捕获设备?这个值显然在directshow的核心位置,因为过滤器图计算每个帧的值,但是我如何得到它呢?我已经查过那些文档了,但还没有发现它的秘密。

我已经创建了自己的IBaseFilter IReferenceClock实现类,它们只会报告大量的调试信息。他们似乎在做他们需要做的事情,但是他们没有提供足够的信息。

至于它的价值,我已经尝试通过检查DirectShow事件队列来研究这个问题,但是似乎没有触发与过滤器图的启动有关的事件,即使我启动了这个图。

下面使用测试应用程序记录的图像可能有助于理解我在做什么。图形内容现在只是一个计时器数秒。摄像头在录屏幕。在捕获帧的特定时刻,系统时间约为1.35秒左右。在DirectShow中记录的样本时间是1.1862秒(忽略图片中的标题)。如何解释本例中.1637秒的差异?流启动时间是推导该值的关键。

系统时钟和参考时钟都使用QueryPerformanceCounter()函数,所以我不认为它是计时器的错误。

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-04-15 07:13:15

图中的过滤器共享参考时钟(除非您删除它,这不是您想要的)和流时间是相对于这个参考时钟的某些基本启动时间。启动时间对应于流时间为零。

通常,控制应用程序无法访问此启动时间,因为filter图管理器在内部选择值,并作为IBaseFilter::Run调用中的参数传递给图中的每个筛选器。如果您至少有一个自己的筛选器,则可以得到值。

在这种情况下,获取绝对捕获时间是一个简单的数学问题:帧时间是基时间+流时间,而且始终可以执行IReferenceClock::GetTime检查当前的有效时间。

如果您仍然没有启动时间的访问权限,并且不希望将自己的筛选器添加到图形中,则可以使用有个诡计自己定义基本启动时间。无论如何,这就是过滤器图形管理器正在做的事情。

同步启动图形意味着使用IMediaFilter::Run而不是IMediaControl::Run.调用所有图形的IMediaFilter::Run,这一次传递.作为参数。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43422072

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档