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


Предоставление настраиваемого средства изменения размера видео

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

[Этот API не поддерживается и может быть изменен или недоступен в будущем.]

Примечание

Для этой функции требуется DirectX 9.0 или более поздней версии.

 

Когда службы редактирования DirectShow (DES) изменяет размер исходного видеоклипа, поведением по умолчанию является StretchBlt, который является быстрым, но не сглаживается. Вы можете изменить поведение изменения размера, реализовав пользовательский резерзерзер в качестве фильтра преобразования DirectShow. Фильтр должен предоставлять интерфейс IResize , который позволяет DES указать размер входного и выходного видео. Сведения о создании фильтра преобразования см. в разделе Запись фильтров преобразования. В качестве отправной точки рекомендуется использовать базовый класс CTransformFilter . При реализации фильтра обратите внимание на следующее:

  • Поддержка интерфейса IResize в фильтре (а не контактов).
  • Фильтр должен принимать только форматы VIDEOINFOHEADER (FORMAT_VideoInfo). Отклонять другие типы форматов.
  • Формат видео из DES может быть любого несжатого типа RGB, включая 32-разрядную rgb с альфа-версией (MEDIASUBTYPE_ARGB32). Фильтр может безопасно отклонять форматы с помощью biHeight< 0.
  • Прежде чем модуль рендеринга соединит выходной контакт фильтра, он вызывает IResize::p ut_MediaType , чтобы задать тип вывода. Он также может вызывать IResize::p ut_Size для настройки размера выходных данных. Он может вызывать эти два метода в любом порядке, любое количество раз, прежде чем подключить выходной контакт.
  • После того как модуль отрисовки подключит выходной контакт, он может снова вызвать put_Size . Фильтр изменения размера должен повторно подключить выходной контакт к новому размеру.
  • В методе CTransformFilter::Transform фильтра растяните входное видео до размера вывода.
  • Фильтр никогда не должен устанавливать флаг разрыва в выходном примере или присоединять тип носителя к выходному образцу.
  • Чтобы сохранить состояние фильтра в grf-файле GraphEdit, реализуйте интерфейс IPersistStream . (Это необязательно, но полезно для тестирования.)

Чтобы использовать фильтр изменения размера, фильтр должен быть зарегистрирован как COM-объект в системе пользователя. Прежде чем приложение отрисовывает видеопроект, запросите модуль render для интерфейса IRenderEngine2 и вызовите IRenderEngine2::SetResizerGUID с CLSID фильтра resizer.

Отрисовка проекта