Захват рабочего стола с помощью Windows Media Format (WMF) - PullRequest
2 голосов
/ 15 сентября 2008

Я использую Windows Media Format SDK для захвата рабочего стола в режиме реального времени и сохранения его в файле WMV (на самом деле это упрощение моего проекта, но это важная часть). Для кодирования я использую кодек Windows Media Video 9 Screen , потому что он очень эффективен для захвата экрана и потому, что он доступен практически всем без необходимости устанавливать что-либо, так как кодек включен в Windows Media Среда выполнения проигрывателя 9 (входит в состав Windows XP SP1).

Я делаю снимки экрана BITMAP с использованием функций GDI и передаю эти BITMAP в кодировщик. Как вы можете догадаться, снимки экрана с помощью GDI идут медленно, и я не получаю экранный курсор, который я должен добавить вручную в BITMAP. BITMAP, которые я получаю изначально, представляют собой DDB, и мне нужно преобразовать их в DIB, чтобы кодировщик мог их понять (вход RGB), и это занимает больше времени.

Запуск профилировщика показывает, что около 50% времени уходит в кодировщик WMVCORE.DLL. Конечно, этого следует ожидать, поскольку кодирование интенсивно использует процессор.

Дело в том, что есть нечто, называемое Windows Media Encoder , которое поставляется с SDK и позволяет делать снимки экрана с использованием нужного кодека более простым и более дружественным к процессору способом.

WME основано на WMF. Это библиотека с более высоким уровнем, а также привязки .NET. Я не могу использовать его в своем проекте, потому что это приводит к нежелательным зависимостям, которых я должен избегать.

Я спрашиваю о методе, который WME использует для подачи данных образца в кодировщик WMV. Кодирование происходит в WME точно так же, как в моем приложении, использующем WMF. WME более эффективен, чем мое приложение, потому что у него гораздо более эффективный способ подачи видеоданных в кодировщик. Он не полагается на медленные функции GDI и преобразования DDB-> DIB.

Как это делается?

Ответы [ 3 ]

1 голос
/ 21 октября 2008

Может быть полезен исходный код CamStudio, приложения для создания скринкастеров под GPL, которое существует уже много лет (коммерчески, а затем open-srcd позже)?

http://sourceforge.net/project/showfiles.php?group_id=131922

Я бы посоветовал взглянуть на внутренности клиентов VNC, хотя они, вероятно, очень просты (я думаю, просто сделать скриншоты, а затем скопировать плитки, которые изменились с момента последнего захвата).

Возможно, вы захотите не использовать WMV9 в качестве кодера для кодирования «на лету», если он слишком загружен процессором? Может быть, использовать более старый, менее эффективный компрессор (например, MS RLE), используемый HyperCam, а затем сжимать до WMV? MS RLE была установка по умолчанию, так как по крайней мере Win2000 я считаю: http://wiki.multimedia.cx/index.php?title=Microsoft_RLE

Кодек CamStudio Lossless - это GPL (та же ссылка, что и выше), которая предлагает довольно хорошее сжатие (хотя вам потребуется объединить dll в вашем установщике) и может использоваться на лету, она хорошо работает с высокой степенью сжатия на всех современные системы.

0 голосов
/ 29 декабря 2008

Вы уже просмотрели библиотеку BB FlashBack ?

Я нахожусь в подобной охоте, и я только начал оценивать библиотеку BB FlashBack.

Я не уверен насчет внешних зависимостей или места установки. Кажется, у него есть собственный кодек, который необходимо установить, но установка кодека может быть выполнена с помощью открытого BB FlashBack API.

Осторожно, существуют лицензионные ограничения (настройка лицензионных ключей во время выполнения, ...)

Я могу отправить вам CHM из SDK по электронной почте, если вы хотите оценить API до совершения лицензионной загрузки.

Вещи, которые я оцениваю: Правильный захват представлений WPF отслеживание курсора мыши Размер сохраненного фильма Как отобразить сохраненный фильм без проприетарного кодека (т.е. экспорт в SWF)

- Batgar

0 голосов
/ 18 сентября 2008

Прошло много лет с тех пор, как я сделал любое Win32-кодирование, но AFAIK, WMF как формат - это, в основном, список команд GDI и их параметров, которые объясняют, почему кодирование гораздо эффективнее ...

Вам, вероятно, потребуется подключиться к контексту GDI верхнего уровня (как я полагаю, как Remote Desktop) и захватить команды GDI по мере их вызова. Кажется, я помню, что был какой-то способ создания выходного GDI-контекста WMF, что означает, что вы можете каким-то образом просто делегировать ему вызовы.

Я предполагаю здесь, но вы, возможно, сможете найти пример кода для вышеупомянутого в проектах TightVNC / QuickVNC для Windows, поскольку им придется делать что-то подобное, чтобы эффективно регистрировать изменения на экране.

...