Предварительный просмотр проекта
[Функция, связанная с этой страницей DirectShow, является устаревшей функцией. Он был заменен MediaPlayer, IMFMediaEngine, и аудио/ видео захвата в Media Foundation. Эти функции оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует, чтобы новый код использовал MediaPlayer, IMFMediaEngine и аудио- и видеозахват в Media Foundation вместо DirectShow, когда это возможно. Корпорация Майкрософт предлагает переписать существующий код, использующий устаревшие API, чтобы по возможности использовать новые API.]
[Этот API не поддерживается и может быть изменен или недоступен в будущем.]
Для предварительного просмотра проекта требуется компонент, называемый обработчиком отрисовки, который создает граф фильтра DirectShow из временная шкала. Фактически отрисовывается проект с помощью графа фильтров. Модуль отрисовки можно использовать для предварительного просмотра проекта или записи окончательного выходного файла.
В этой статье не рассматриваются подробные сведения о механизме отрисовки. Для предварительной версии требуется только несколько вызовов методов. Более подробное обсуждение, включая запись выходных файлов, можно найти в разделе Отрисовка проекта. В следующем примере кода показано, как создать граф предварительного просмотра.
IRenderEngine *pRender = NULL;
hr = CoCreateInstance(CLSID_RenderEngine, NULL, CLSCTX_INPROC_SERVER,
IID_IRenderEngine, (void**) &pRender);
hr = pRender->SetTimelineObject(pTL);
hr = pRender->ConnectFrontEnd( );
hr = pRender->RenderOutputPins( );
Создайте подсистему отрисовки с помощью функции CoCreateInstance . Затем вызовите следующие методы в интерфейсе IRenderEngine обработчика отрисовки:
- SetTimelineObject. Указывает используемый временная шкала.
- ConnectFrontEnd. Создает частичный граф фильтра с одним выводом для каждой группы в временная шкала.
- RenderOutputPins. Завершает график предварительного просмотра путем подключения каждого выходного контакта к отрисовщику видео или аудио.
После построения графа можно просмотреть проект, запустив граф, как и любой граф фильтра DirectShow. Сначала получите указатель на граф фильтра, вызвав метод IRenderEngine::GetFilterGraph .
IGraphBuilder *pGraph = NULL;
hr = pRender->GetFilterGraph(&pGraph);
Запрос графа фильтров для интерфейсов IMediaControl и IMediaEvent . Используйте эти два интерфейса для запуска графа и ожидания завершения воспроизведения. Описание использования этих интерфейсов см. в разделах Воспроизведение файла и Реагирование на события. В следующем коде показан один из способов использования этих интерфейсов.
IMediaControl *pControl = NULL;
IMediaEvent *pEvent = NULL;
long evCode;
pGraph->QueryInterface(IID_IMediaControl, (void **)&pControl);
pGraph->QueryInterface(IID_IMediaEvent, (void **)&pEvent);
hr = pControl->Run();
hr = pEvent->WaitForCompletion(INFINITE, &evCode);
pControl->Stop();
Код в этом примере блокирует выполнение программы до завершения воспроизведения из-за параметра INFINITE в вызове метода IMediaEvent::WaitForCompletion . Однако если во время воспроизведения что-то пойдет не так, это может привести к тому, что программа перестанет отвечать на запросы. В реальном приложении используйте цикл сообщений, чтобы дождаться завершения воспроизведения. Также рекомендуется предоставить пользователю способ прерывания воспроизведения.
Завершив работу с обработчиком отрисовки, всегда вызывайте метод IRenderEngine::ScrapIt . Этот метод удаляет граф фильтров и освобождает все ресурсы, хранящиеся в подсистеме отрисовки.
pRender->ScrapIt();
Связанные темы