Я использую 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.
Как это делается?