Я пытаюсь написать приложение, которое будет захватывать видеопоток экрана и отправлять его на удаленный клиент. Я обнаружил, что лучший способ сделать снимок экрана в Windows — это использовать DXGI Desktop Duplication API (доступно начиная с Windows 8). Microsoft предоставляет аккуратный образец который передает дублированные кадры на экран. Теперь мне стало интересно, какой самый простой, но все же относительно быстрый способ кодировать эти кадры и отправлять их по сети.
Кадры приходят из AcquireNextFrame
с поверхностью, содержащей растровое изображение рабочего стола и метаданные, которые содержат грязные и перемещаемые области, которые были обновлены. Отсюда у меня есть несколько вариантов:
Поскольку я не делал ничего подобного раньше, я спрашиваю, двигаюсь ли я в правильном направлении. В конце концов, я хочу получить простой, желательно с низким временем ожидания, видеопоток для захвата рабочего стола, который я могу просматривать с удаленного устройства.
Кроме того, мне интересно, могу ли я использовать грязные и перемещаемые области, предоставляемые Desktop Duplication. Вместо того, чтобы кодировать кадр, я могу отправить их по сети и выполнить обработку на стороне клиента, но это означает, что моему клиенту должен быть доступен DirectX 11.1 или выше, что невозможно, если я захочу выполнить потоковую передачу на мобильную платформу ,
Ты можешь использовать IMFTransform интерфейс для кодирования H264. Как только вы получите IMFSample от ID3D11Texture2D просто передайте это IMFTransform :: ProcessInput и получить закодированный IMFSample из IMFTransform :: ProcessOutput.
обращаться этот пример для кодирования деталей.
Получив зашифрованные образцы IMFS, вы можете отправить их один за другим по сети.
Других решений пока нет …