Быстрый захват экрана и запись видео - PullRequest
1 голос
/ 01 сентября 2009

Кто-нибудь работал над захватом экрана в видеопоток (для сохранения в локальном файле или отправки в сеть)?

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

Приемлемая (хотя и далеко не желаемая) производительность достигается путем отправки несжатых кадров BMP в сеть, но по многим причинам важно хотя бы некоторое сжатие на месте.

Любые предложения о том, как кодировать, используя как можно меньшую вычислительную мощность: может быть, очень быстрый кодек? Или какие-то хитрости, чтобы избежать копирования изображений в память? Стоит ли делать захват экрана с помощью DirectX (большая часть экрана в WPF)?

Ответы [ 4 ]

2 голосов
/ 01 сентября 2009

Хорошо ... это дикое предположение, потому что я никогда не пробовал ... но это кажется правдоподобным. Я думаю, что вы должны использовать Nvidia CUDA. Например:

Я думал, что вы можете создавать текстуры из изображения (в памяти) и сжимать его потом. В CUDA SDK есть образец для DirectX Texture Compressor (DXTC):

Высококачественное сжатие DXT с использованием CUDA. В этом примере показано, как реализовать существующий вычислительно-интенсивный алгоритм сжатия ЦП параллельно на графическом процессоре и получить повышение производительности на порядок.

Вы можете хранить ряд текстур в памяти (в зависимости от объема видеопамяти) и записывать их на диск / сокет другого потока.

Это всего лишь предположение ... Я думаю, что лучший способ - реализовать алгоритм кодирования (см. TMPGEnc ) с использованием CUDA для перемещения нагрузки с ЦП на графический процессор, но это сложно и требует много работы.

1 голос
/ 28 февраля 2010

Я просто столкнулся с этим во время поиска CUDA и захвата экрана и подумал, что должен добавить свой опыт. Я создал решение в прошлом, используя VNC и FFMPEG. Если вы посмотрите на протоколы VNC, вы увидите, что он выполняет свои передачи на основе дельта-окон с новым изображением. В основном, предыдущий экран + изменения = новый экран. Единственное, что нужно передать - это изменения. Вы найдете множество хитростей, позволяющих минимизировать стоимость передачи, и множество различных расширений полезной нагрузки для передачи данных, и это отличный ресурс, даже если вы решите поработать с полученными знаниями. Как только мы использовали VNC для перемещения пиксельных данных, мы обнаружили, что необработанные пиксельные данные были более дорогими для нашего процессора, чем данные JPEG, поскольку буферные копии были дороже, чем сжатие.

0 голосов
/ 21 сентября 2011

для меня, используя ffmpeg + снимок экрана DirectShow устройство + huffyyuv использует маленький процессор Но тонны диска / пропускной способности:)

0 голосов
/ 01 сентября 2009

Многие программы делают это с графическим интерфейсом, таким как xvidcap или camstudio, но ffmpeg может быть хорошим решением для вас ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...