Как декодировать видеофайл прямо в текстуру Direct3D11 с помощью Windows Media Foundation? - PullRequest
0 голосов
/ 18 февраля 2019

Я бы хотел декодировать содержимое видеофайла в текстуру Direct3D11 и избегать копий назад и вперед в память процессора.В идеале библиотека будет воспроизводить звук сама и вызывать мой код всякий раз, когда видеокадр будет декодирован.

На первый взгляд, IMFPMediaPlayer Фонда Windows Media Foundation (то есть MFPCreateMediaPlayer () и IMFPMediaPlayer :: CreateMediaItemFromURL ()) кажется хорошим совпадением, за исключением того, что плеер декодирует прямо в HWND приложения.Документация подразумевает, что я могу добавить пользовательский приемник видео, но я не смог найти ни документацию, ни пример кода, как это сделать.Пожалуйста, направьте меня в правильном направлении.

В настоящее время я использую libVLC для выполнения вышеизложенного, но он обеспечивает только видеоповерхность в памяти процессора, что может стать узким местом для моего варианта использования.

Спасибо.

1 Ответ

0 голосов
/ 20 февраля 2019

Посмотрите на этот исходный код из моего проекта 'Stackoverflow': MFVideoEVR

Эта программа показывает, как настроить EVR (улучшенный рендерер видео) и как обеспечитьсэмплы видео к нему, используя Source Reader.

Ключ заключается в предоставлении сэмплов видео, чтобы вы могли использовать их для своих целей.

Эта программа предоставляет сэмплы через IMFVideoSampleAllocator.Это для текстуры DirectX9.Вам нужно изменить исходный код и использовать вместо него IMFVideoSampleAllocatorEx: IMFVideoSampleAllocatorEx

О MFCreateVideoSampleAllocatorEx:

Эта функция создает распределитель для поверхностей видео DXGI.Буферы, созданные этим распределителем, предоставляют интерфейс IMFDXGIBuffer.

Таким образом, чтобы получить текстуру: IMFDXGIBuffer :: GetResource

Этот метод можно использовать дляполучить указатель на интерфейс ID3D11Texture2D поверхности.Если буфер заблокирован, метод возвращает MF_E_INVALIDREQUEST.

Вам также придется управлять звуком через IMFSourceReader.

При таком подходе копирование обратно в системную память отсутствует.

PS: Вы не говорите о формате видео (h265, h264, mpeg2, другие ??).MediaFoundation не поддерживает все видео форматы.

...