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


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

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

Загрузка и предпросмотр проекта