设置图形时钟

[与此页面关联的功能 DirectShow 是一项旧功能。 它已被 MediaPlayerIMFMediaEngine媒体基金会中的音频/视频捕获取代。 这些功能已针对Windows 10和Windows 11进行了优化。 Microsoft 强烈建议新代码尽可能使用 MediaPlayerIMFMediaEngineMedia 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 指针。

还可以通过调用值为 NULLSetSyncSource,将筛选器图设置为在没有时钟的情况下运行。 如果没有时钟,图形将尽快运行。 在没有时钟的情况下,呈现器筛选器不会等待样本的呈现时间。 相反,它们会在每个样本到达时立即呈现。 如果要快速处理数据,而不是实时预览数据,将图形设置为在没有时钟的情况下运行会很有用。

基本 DirectShow 任务

CBaseReferenceClock 类

DirectShow 中的时间和时钟