首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DirectShow IReferenceClock实现

DirectShow IReferenceClock实现
EN

Stack Overflow用户
提问于 2014-09-05 21:05:57
回答 1查看 1.1K关注 0票数 0

如何实现可以通过IReferenceClock设置的IMediaFilter::SetSyncSource

我有一个实现GetTimeAdviseTimeUnadviseTime的系统。当一个流开始播放时,它通过AdviseTime设置一个基本时间,然后为每个后续的建议增加流时间。

然而,我如何知道什么时候运行了一个新的图表?我需要为给定的参考时钟设置一个零点。否则,如果我创建一个参考时钟,然后,10秒后,我启动图形,我现在的位置,我不知道我是否应该向下10秒的播放,或我是否应该从0开始。很明显,基本时间会说我是从0开始,但是我是不是只是停顿了10秒,我是否需要抛出很多帧呢?

我实在想不出怎么写一个合适的IReferenceClock,所以任何提示或想法都会受到极大的赞赏。

编辑:我遇到一个问题的一个例子是,我有2个图表和2个视频。来自这两个视频的音频将转到一个空渲染器。视频转换成标准的CLSID_VideoRenderer。现在,如果我将相同的参考时钟设置为这两个,然后运行图1,所有似乎都是好的。但是,如果沿着10秒运行图形2,那么它将在前10秒左右运行,就好像SetSyncSource是空的一样,直到它赶上了另一个视频。

显然,如果图形调用GetTime来获得它们的“基本时间”,这将解决问题,但这不是我所看到的。这两个视频的基本时间都是0,因为这正是我运行它们的关键所在。

值得注意的是,如果我根本没有设置时钟(或调用SetDefaultSyncSource),那么这两个图都会尽可能快地运行。我想这是因为缺乏音频渲染器..。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-05 21:17:21

然而,我如何知道什么时候运行了一个新的图表?

时钟是独立运行的,是图形将其操作与时钟对齐,而不是其他操作。该图形接收外部Run调用,然后检查当前时钟时间,并将分布在滤波器之间的基准时间分配为“当前时钟时间+物体起飞的某个时间”。时钟本身不需要对所有这些都有一个最模糊的概念,它的任务是继续运行,并不断增加时间。

特别是,时钟时间不需要在任何时候重置为零。

来自文件:

时钟的基线--开始计数的时间--取决于实现,因此GetTime返回的值本质上没有意义。重要的是从图形开始运行时的增量。 当应用程序调用IMediaControl::Run以运行筛选图时,filter在每个过滤器上调用IMediaFilter::运行。为了补偿过滤器开始运行所需的少量时间,将在未来稍微指定一个启动时间。

BaseClasses提供CBaseReferenceClock类,您可以使用它作为引用实现(在refclock.*中)。

对编辑的评论:

你显然没有完整地描述这件事,你忽略了一些重要的细节。有一个简单的测试:您可以实例化标准时钟(CLSID_SystemClock),并在两个常规图上使用它们--它们运行良好,即使时间间隔为Run时间。

我怀疑你是在做一些同步或匹配之间的图表,你是时间冲压样本,也使用时钟。想必你在这一点上做错了什么,然后你很难通过时钟来修正它。

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

https://stackoverflow.com/questions/25693972

复制
相关文章

相似问题

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