Я использую 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.
Как это сделать?
Я думаю, вы думаете о Windows Metafiles, что не то же самое, что Windows Media Format (аудио/видео кодировщик). – jeffm 2008-10-07 14:53:20