Поделиться через


Настройка часов графа

[Функция, связанная с этой страницей, DirectShow, является устаревшей функцией. Он был заменен MediaPlayer, IMFMediaEngineи аудио/видеозахватом в Media Foundation. Эти функции оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует в новом коде использовать MediaPlayer, IMFMediaEngine и Audio/Video Capture в Media Foundation вместо DirectShowпо возможности. Корпорация Майкрософт предлагает, что существующий код, использующий устаревшие API, будет перезаписан для использования новых API, если это возможно.]

При создании графа фильтров диспетчер графов фильтров автоматически выбирает эталонные часы для графа. Все фильтры в графе синхронизируются с эталонными часами. В частности, фильтры отрисовщика используют эталонные часы для определения времени представления каждого примера.

Обычно нет причин для приложения переопределить выбор эталонных часов диспетчера фильтров. Однако это можно сделать, вызвав метод IMediaFilter::SetSyncSource в диспетчере графов фильтра. Этот метод принимает указатель на интерфейс IReferenceClock. Вызовите метод во время остановки графа.

Если фильтр предоставляет часы, вы можете получить указатель IReferenceClock путем вызова QueryInterface в фильтре. Кроме того, можно реализовать внешние эталонные часы, которые не предоставляются фильтром, если внешние часы реализуют 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.

Вы также можете задать график фильтров для запуска без часов, вызвав SetSyncSource со значением NULL. Если нет часов, граф работает как можно быстрее. Без часов фильтры рендеринга не ожидают времени представления образца. Вместо этого они отрисовывают каждый образец сразу после прибытия. Настройка графика для запуска без часов полезна, если вы хотите быстро обрабатывать данные, а не просматривать их в режиме реального времени.

основные задачи DirectShow

Класс CBaseReferenceClock

Время и Часы в DirectShow