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


Предварительный просмотр проекта

[Функция, связанная с этой страницей 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();

Загрузка и предварительный просмотр проекта