2008-09-15 16 views
2

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

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

Увольнение профайлера показывает, что около 50% времени проводится в WMVCORE.DLL, кодере. Этого следует ожидать, конечно, поскольку кодирование является интенсивным CPU.

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

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

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

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

ответ

0

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

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

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

+0

Я думаю, вы думаете о Windows Metafiles, что не то же самое, что Windows Media Format (аудио/видео кодировщик). – jeffm 2008-10-07 14:53:20

1

Возможно, был полезен источник для CamStudio, приложения для скринкастинга GPL'а, которое существует уже много лет (коммерчески, а затем и open-srcd).

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

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

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

CamStudio является GPL (такая же связь, как описано выше), который предлагает очень хорошее сжатие (хотя вы должны были бы расслоение DLL в вашей установки) и может использоваться «на лету», он хорошо работает при высоком сжатии на всех современных системах.

0

Вы проверили библиотеку BB FlashBack?

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

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

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

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

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

--Batgar

Смежные вопросы