设置图形时钟
[与此页面关联的功能 DirectShow 是一项旧功能。 它已被 MediaPlayer、 IMFMediaEngine 和 媒体基金会中的音频/视频捕获取代。 这些功能已针对Windows 10和Windows 11进行了优化。 Microsoft 强烈建议新代码尽可能使用 MediaPlayer、 IMFMediaEngine 和 Media Foundation 中的音频/视频捕获 ,而不是 DirectShow。 如果可能,Microsoft 建议重写使用旧 API 的现有代码以使用新 API。]
生成筛选器图时,筛选器关系图管理器会自动为图形选择引用时钟。 图中的所有筛选器都同步到参考时钟。 具体而言,呈现器筛选器使用引用时钟来确定每个样本的呈现时间。
应用程序通常没有理由替代筛选器关系图管理器选择的引用时钟。 但是,可以通过在 Filter Graph 管理器上调用 IMediaFilter::SetSyncSource 方法来执行此操作。 此方法采用指向时钟的 IReferenceClock 接口的指针。 在图形停止时调用 方法。
如果筛选器提供时钟,则可以通过在筛选器上调用 QueryInterface 来获取 IReferenceClock 指针。 或者,只要外部时钟实现 IReferenceClock,就可以实现筛选器未提供的外部引用时钟。 以下示例演示如何指定时钟:
IGraphBuilder *pGraph = 0;
IReferenceClock *pClock = 0;
CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,
IID_IGraphBuilder, (void **)&pGraph);
// Build the graph.
pGraph->RenderFile(L"C:\\Example.avi", 0);
// Create your clock.
hr = CreateMyPrivateClock(&pClock);
if (SUCCEEDED(hr))
{
// Set the graph clock.
IMediaFilter *pMediaFilter = 0;
pGraph->QueryInterface(IID_IMediaFilter, (void**)&pMediaFilter);
pMediaFilter->SetSyncSource(pClock);
pClock->Release();
pMediaFilter->Release();
}
此示例假定 CreateMyPrivateClock 是应用程序定义的函数,用于创建时钟并返回 IReferenceClock 指针。
还可以通过调用值为 NULL 的 SetSyncSource,将筛选器图设置为在没有时钟的情况下运行。 如果没有时钟,图形将尽快运行。 在没有时钟的情况下,呈现器筛选器不会等待样本的呈现时间。 相反,它们会在每个样本到达时立即呈现。 如果要快速处理数据,而不是实时预览数据,将图形设置为在没有时钟的情况下运行会很有用。
相关主题