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