Я пишу приложение для захвата экрана, использующее UWP Screen Capture API .
В результате я получаю обратный вызов для каждого кадра с ID3D11Texture2D
с целевым экраномили изображение приложения, которое я хочу использовать в качестве входных данных для SinkWriter MediaFoundation для создания файла контейнера h264 в mp4.
Есть две проблемы, с которыми я сталкиваюсь:
- Текстура неПроцессор считывается и пытается отобразить его неудачно
- Текстура имеет отступ (шаг изображения> ширина пикселя * размер формата пикселя), я полагаю
Чтобы решить их, мой подход заключается в:
- Используйте
ID3D11DeviceContext::CopyResource
, чтобы скопировать исходную текстуру в новую, созданную с D3D11_USAGE_STAGING
и D3D11_CPU_ACCESS_READ
flags - Поскольку эта текстура тоже имеетзаполнение, создайте буфер
IMFMediaBuffer
, оборачивая его MFCreateDXGISurfaceBuffer
, приведите его к IMF2DBuffer
и используйте IMF2DBuffer::ContiguousCopyTo
к другому IMFMediaBuffer, который я создаю с MFCreateMemoryBuffer
Так что я в основном копирую каждый кадр два раза, один разe GPU и один раз на CPU, который работает, но кажется неэффективным.
Как лучше это сделать?Является ли MediaFoundation достаточно умным, чтобы справляться с входными кадрами, которые имеют отступы?