到底是如何你的意思是实现能够通过IMediaFilter::SetSyncSource
设置的IReferenceClock
?DirectShow的IReferenceClock实施
我有一个系统,实现GetTime
和AdviseTime
,UnadviseTime
。当一个流开始播放时,它会通过AdviseTime
设置一个基准时间,然后为每个后续提示增加流时间。
但是,我应该怎么知道新图形运行的时间?我需要为给定的参考时钟设置一个零点。否则,如果我创建了一个参考时钟,然后在10秒钟后,我开始绘制图表,现在我处于不知道是否应该在播放10秒钟或者是否应该从0开始的位置。显然,基准时间会说我从0开始,但是我只是停了10秒钟,我是否需要放下一堆帧?
我真的似乎无法弄清楚如何写一个适当的IReferenceClock
所以任何提示或想法将非常感激。
编辑:我有一个问题的一个例子是,我有2个图表和2个视频。来自两个视频的音频都将转为空渲染器。视频转换为标准的CLSID_VideoRenderer。现在,如果我设置相同的参考时钟,然后运行图1似乎都很好。但是,如果在线10秒钟后运行图形2,那么它将运行,就好像SetSyncSource
在前10秒左右为空,直到它赶上另一个视频。
显然,如果叫GetTime
图表得到他们的“基地的时间”,这将解决这个问题,但这不是我所看到的情况发生。这两个视频最终的基准时间为0,因为这是我运行它们的关键。
其值得注意的是,如果我设置完全没有时钟(或称SetDefaultSyncSource
),那么这两个图表跑得快,因为他们可以。我认为这是由于缺乏音频渲染器...
谢谢,但我想了解底层系统是如何工作的,所以我避免了CBaseReferenceClock。我用更多信息编辑了我的问题。 – Goz 2014-09-05 21:28:15
我提供了查看'CBaseReferenceClock'代码而不是使用它。你会发现它非常简单,而且最重要的是它无论如何都能增加时间。标准时钟只是'timeGetTime()* 10000' +建议周围的东西。这就足够了。 – 2014-09-05 21:34:10
我现在已经尝试在两个图表上设置一个SystemClock。两个图都像SyncSource设置为NULL(即全速)一样运行。 – Goz 2014-09-05 21:36:37