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

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

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

  • DVD Graph Builder. Вспомогательный объект, создающий граф фильтра. Он предоставляет интерфейс 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 Graph выбирает отрисовщик по умолчанию. Затем создайте граф, вызвав метод IDvdGraphBuilder::RenderDvdVideoVolume .

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

Первый параметр — это имя каталога, содержащего DVD-файлы. На DVD-диске эти файлы находятся в каталоге с именем VIDEO_TS. Если первый параметр имеет значение NULL, DVD Graph Builder использует первый диск, содержащий том 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 Graph Builder . Этот подход показан ниже и в примере приложения ДЛЯ DVD. Если вам нужно создать граф фильтра DVD вручную, это можно сделать, следуя основным правилам построения графов, описанным в документации по DirectShow. Как правило, не следует вручную добавлять, удалять, подключать или отключать отдельные фильтры в графе, созданном конструктором DVD Graph Builder, так как это может привести к запутанию кода очистки.

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

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

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

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

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

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

Оконный режим

В оконном режиме (Overlay Mixer или VMR) отрисовщик создает собственное окно видео. Чтобы сделать это окно дочерним по отношению к окну приложения, вызовите IVideoWindow::p ut_Owner с дескриптором приложения. Также вызовите метод IVideoWindow::p ut_WindowStyle , чтобы задать стили WS_CHILD и WS_CLIPSIBLINGS в окне видео отрисовщика. Чтобы получить сообщения мыши из окна видео отрисовщика, вызовите IVideoWindow::p ut_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-приложения