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

[Функция, связанная с этой страницей DirectShow, является устаревшей функцией. Он был заменен MediaPlayer, IMFMediaEngine, и аудио/ видео захвата в Media Foundation. Эти функции оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует использовать в новом коде MediaPlayer, IMFMediaEngine и аудио/видеозахват в 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