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


Создание графа фильтра DVD

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

Как и в любом приложении DirectShow, приложение воспроизведения DVD начинается с создания графа фильтра. DirectShow предоставляет следующие компоненты для воспроизведения DVD-дисков:

  • построитель графов DVD. Вспомогательный объект, создающий граф фильтра. Он предоставляет интерфейс IDvdGraphBuilder.
  • фильтр DVD-навигатора. Фильтр DirectShow, который обрабатывает воспроизведение DVD,навигацию и другие команды.

Для воспроизведения DVD-дисков также требуется декодатор MPEG-2. Аппаратные и программные декодеры MPEG-2 доступны от сторонних разработчиков. Сначала создайте экземпляр объекта DVD Graph Builder.

IDvdGraphBuilder *pBuild = NULL;
hr = CoCreateInstance(CLSID_DvdGraphBuilder, NULL, 
    CLSCTX_INPROC_SERVER, IID_IDvdGraphBuilder, (void **)&pBuild);

На этом этапе можно выбрать и настроить отрисовщик видео перед сборкой остальной части графа. Этот шаг, который является необязательным, подробно описан в следующем разделе. Если этот шаг пропущен, построитель DVD-графов выбирает рендерер по умолчанию. Затем создайте граф, вызвав метод IDvdGraphBuilder::RenderDvdVideoVolume.

AM_DVD_RENDERSTATUS buildStatus;
hr = pBuild->RenderDvdVideoVolume(L"Z:\\video_ts", 0, &buildStatus);

Первым параметром является имя каталога, содержащего DVD-файлы. На DVD-диске эти файлы находятся в каталоге с именем VIDEO_TS. Если первый параметр равен NULL, построитель DVD Graph использует первый диск, содержащий том DVD.

Второй параметр содержит различные необязательные флаги для выбора типа декодера (оборудования или программного обеспечения) и других параметров.

Третий параметр — это структура AM_DVD_RENDERSTATUS, который принимает информацию о статусе. Если методRenderDvdVideoVolume возвращает S_FALSE, это означает, что вызов частично выполнен (или частично завершился ошибкой, если вы пессимист). Например, метод может не удается отобразить поток подпиктуры, даже если другие потоки успешно отрисованы. Если метод RenderDvdVideoVolume возвращает код ошибки или значение S_FALSE, можно просмотреть структуру AM_DVD_RENDERSTATUS для получения сведений об ошибке.

Затем получите указатель на диспетчер графов фильтров, вызвав IDvdGraphBuilder::GetFiltergraph. Этот метод возвращает указатель на интерфейс IGraphBuilder менеджера графов фильтра.

IGraphBuilder *pGraph = NULL;
hr =  pBuild->GetFiltergraph(&m_pGraph);

Используйте метод IDvdGraphBuilder::GetDvdInterface для получения интерфейсов, связанных с DVD, включая следующие:

  • IDvdControl2. Управляет командами воспроизведения и DVD
  • IDvdInfo2. Возвращает сведения о текущем состоянии DVD-навигатора.
  • IAMLine21Decoder. Управление отображением субтитров. Отображение закрытого заголовка по умолчанию включено. Чтобы отключить его, вызовите IAMLine21Decoder::SetServiceState с флагом AM_L21_CCSTATE_Off.
  • IBasicAudio. Управляет звуком и балансом.

Например, следующий код возвращает интерфейс IDvdControl2.

IDvdControl2 *pDvdControl = NULL;
hr = pBuild->GetDvdInterface(IID_IDvdControl2, (void**)&pDvdControl);

Рекомендуемый способ создания графа фильтра воспроизведения DVD заключается в том, чтобы объект построитель DVD-графов сделал это автоматически. Этот подход показан ниже и в примере dvd-приложения. Если вам нужно вручную создать граф фильтра DVD, это можно сделать, следуя основным правилам построения графа, описанным в документации DirectShow. Как правило, не следует вручную добавлять, удалять, подключать или отключать отдельные фильтры в графе, созданном построителем DVD-графов, так как это может запутать код очистки.

Настройка отрисовщика видео

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

Если вы запрашиваете любой из этих интерфейсов перед созданием графа фильтра, построитель DVD-графов создает соответствующий видео рендерер. Позже при сборке графа построитель DVD-графов попытается использовать этот рендерер. Но если он не может создать граф с помощью выбранного отрисовщика, он может переключиться на другой отрисовщик. Например, ваш декодер MPEG-2 может быть несовместим с фильтром VMR, в этом случае DVD Graph Builder по умолчанию перейдет на Overlay Mixer.

Эти интерфейсы также позволяют настроить отрисовщик перед подключением к декоде. Например, вы можете настроить VMR на использование безоконного режима вместо оконного режима по умолчанию. Дополнительные сведения об отрисовщиках видео см. в разделе о отрисовке видео в DirectShow.

В Windows XP и более поздних версиях построитель DVD-графов всегда использует средство Видеосмешивания 7 (VMR-7), если только:

  • Вызывающий объект запрашивает интерфейсы, доступные только в Наложенном миксере , такие как IMixerPinConfig2. Это отправляет намёк построителю DVD-графов, что приложение хочет использовать наложение Overlay Mixer, а не VMR. Проигрыватель Windows Media также имеет диалоговое окно с опцией для принудительного использования микшера наложения.
  • Установленный декодировщик не совместим с VMR. Во время построения графа новый интерфейс IAMDecoderCaps используется для проверки поддержки VMR декодера. Если это отсутствует, построитель DVD-графов будет использовать наложенный микшер.
  • При использовании аппаратного декодера декодировщик не может подключиться к диспетчеру видеопортов (VPM). Если аппаратный декодировщик не может использовать VPM, то он не может использовать VMR, и тогда построитель DVD-графов пытается создать граф с помощью Overlay Mixer.
  • Видеокарта известна тем, что имеет недостаточно ресурсов и/или возможностей для поддержки VMR, но неправильно отражает это в драйвере. (Некоторые известные случаи специально исключены DVD Graph Builder.)
  • Подключение между декодером и VMR завершается сбоем по какой-либо причине, как правило, из-за отсутствия виртуальной памяти для создания необходимых поверхностей. В таких случаях DVD Граф Строитель отключает использование VMR и пытается использовать Оверлейный микшер для создания диаграммы.

Режим окна

В оконном режиме (Overlay Mixer или VMR) рендерер создает собственное видеоокно. Чтобы сделать это окно дочерним элементом окна приложения, вызовите IVideoWindow::put_Owner с дескриптором приложения. Также вызовите IVideoWindow::p ut_WindowStyle, чтобы задать стили WS_CHILD и WS_CLIPSIBLINGS в окне видео отрисовщика. Чтобы получить сообщения мыши из окна видео отрисовщика, вызовите IVideoWindow::put_MessageDrain с дескриптором вместе с окном приложения. Этот метод настраивает "поглощение сообщений" — окно видео пересылает все сообщения мыши, которые оно получает, в окно поглощения сообщений.

pVideoWindow->put_Owner((OAHWND)hwnd);
pVideoWindow->put_WindowStyle(WS_CHILD | WS_CLIPSIBLINGS);
pVideoWindow->put_MessageDrain((OAHWND)hwnd) ;

Постоянные сообщения несколько усложняют выбор кнопок меню DVD. Если окно видео не заполняет всю клиентскую область приложения, некоторые события мыши будут выпадать за пределы окна видео. При получении события мыши из в видеоокне его следует обработать для навигации по меню DVD. События мыши из за пределами не должны обрабатываться. При утечке сообщений нет способа различать эти два. Кроме того, координаты событий мыши из окна видео относительно клиентской области окна видео; но события мыши извне окна видео относятся к клиентской области приложения.

Режим без окон

Безоконный режим полностью избегает проблем, связанных с сообщениями мыши. Не требуется утечка сообщений, так как VMR (или EVR) не создает собственное окно в режиме без окон. Вместо этого он обращается непосредственно к окну приложения. Если прямоугольник назначения меньше клиентской области приложения, DVD-навигатор учитывает это при вычислении позиций кнопки DVD. Поэтому при получении сообщения мыши можно передать координаты непосредственно в DVD-навигатор, как описано в разделе "Навигация меню".

DVD-приложения