DXGI Desktop Duplication: кодирование кадров для отправки их по сети

Я пытаюсь написать приложение, которое будет захватывать видеопоток экрана и отправлять его на удаленный клиент. Я обнаружил, что лучший способ сделать снимок экрана в Windows — это использовать DXGI Desktop Duplication API (доступно начиная с Windows 8). Microsoft предоставляет аккуратный образец который передает дублированные кадры на экран. Теперь мне стало интересно, какой самый простой, но все же относительно быстрый способ кодировать эти кадры и отправлять их по сети.

Кадры приходят из AcquireNextFrame с поверхностью, содержащей растровое изображение рабочего стола и метаданные, которые содержат грязные и перемещаемые области, которые были обновлены. Отсюда у меня есть несколько вариантов:

  1. Извлеките растровое изображение из поверхности DirectX, а затем используйте внешнюю библиотеку, например FFmpeg кодировать серии растровых изображений в H.264 и отправлять их по RTSP. Несмотря на простоту, я боюсь, что этот метод будет слишком медленным, поскольку он не использует преимущества любых собственных методов Windows. Преобразование текстуры D3D в ffmpeg-совместимое растровое изображение кажется ненужной работой.
  2. Из этого ответа: конвертировать D3D текстуру в IMFSample и использовать MediaFoundation’s SinkWriter кодировать кадр. я нашел этот урок кодирования видео, но я еще не нашел способ немедленно получить закодированный кадр и отправить его вместо того, чтобы выгружать их все в видеофайл.

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

Кроме того, мне интересно, могу ли я использовать грязные и перемещаемые области, предоставляемые Desktop Duplication. Вместо того, чтобы кодировать кадр, я могу отправить их по сети и выполнить обработку на стороне клиента, но это означает, что моему клиенту должен быть доступен DirectX 11.1 или выше, что невозможно, если я захочу выполнить потоковую передачу на мобильную платформу ,

6

Решение

Ты можешь использовать IMFTransform интерфейс для кодирования H264. Как только вы получите IMFSample от ID3D11Texture2D просто передайте это IMFTransform :: ProcessInput и получить закодированный IMFSample из IMFTransform :: ProcessOutput.

обращаться этот пример для кодирования деталей.

Получив зашифрованные образцы IMFS, вы можете отправить их один за другим по сети.

4

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector