Использование DirectShow с Direct2D

#c #video #directshow #ms-media-foundation #direct2d

#c #Видео #directshow #ms-media-foundation #direct2d

Вопрос:

У меня есть приложение Direct2D только для Windows, и я хотел бы внедрить систему воспроизведения видео для роликов. Эти файлы имеют формат mp4, но при необходимости формат можно изменить.

Похоже, что DirectShow — это рекомендуемый способ визуализации видео / аудио в Windows.

Теперь, как мне разрешить DirectShow отображать видеокадры для моей цели Direct2D для рендеринга?

Фильтр VMR-9 выглядит как лучший маршрут, но я не могу найти элегантный способ его интеграции в мое приложение

Ответ №1:

В Windows нет уровня взаимодействия Direct2D / DirectShow. Чтобы соответствовать этим двум технологиям, вам пришлось бы копировать данные между API довольно неэффективным способом (и это все равно займет некоторое время для разработки подгонки).

Для видеофайлов H.264 / HEVC MP4 вам лучше использовать Media Foundation для чтения и декодирования кадров, затем загружать их в растровые изображения Direct2D и отображать в вашем приложении. С точки зрения производительности можно передавать видеокадры в растровые изображения Direct2D через графический процессор по разумной цене и с разумными усилиями по разработке, но даже если вы создадите ярлык и сделаете интеграцию грубо и неэффективно, это будет на одном уровне с DirectShow.

Я рекомендую начать с изучения чтения и декодирования видеокадров с помощью Media Foundation Source Reader API. Как только вы познакомитесь с настройкой технологий, вы предпримете следующий шаг и оптимизируете передачу, используя мощность графического процессора и взаимодействие между Direct3D и Direct2D.

Комментарии:

1. Поэтому я использую программу чтения исходного кода WMF для чтения образцов с помощью ReadSample. Эти образцы содержат видеобуфер DirectX, к которому я обращаюсь с помощью Direct2D IDXGISurface, который создает SharedBitmap?

2. В общем случае образцы содержат читаемые данные (байты), которые вы можете использовать для заполнения вашего растрового изображения Direct2D. В расширенном случае вы используете устройство Direct3D 11 с устройством чтения исходных текстов и имеете образцы, содержащие текстуры, затем вы получаете данные Direct2D из этих текстур с помощью interop, минуя копирование байтов и сохраняя данные в видеопамяти во время перехода.