Использование Windows Media Encoder для записи экрана

Легко ли написать код.Net для записи экрана и звука (с компьютерного микрофона), а затем вывести в файл wmv. Любой ссылочный код?

Кстати: я искал все коды из WME SDK, такого примера кода нет.

Спасибо! Джордж

6 ответов

Microsoft и контент мафии ^ H ^ H ^ H ^ Hindustry делают все возможное, чтобы сделать это невозможным. Вам будет гораздо удобнее искать "захват аудио экрана с открытым исходным кодом", чем просматривать любую официально предоставленную документацию / пример кода - я был бы очень удивлен, если бы Microsoft предоставила что-нибудь соответствующее.

Проверьте SDK, который доступен для Techsmith Camtasia:

Camtasia - это полноэкранное приложение для записи на рабочем столе с поддержкой различных видео и аудио источников, кодеков и т. Д., И их SDK представляет это как элемент управления ActiveX (который вы можете легко вызвать из.NET).

Существуют DirectShow-совместимые фильтры для захвата экрана. Что позволит вам использовать любую программу записи для захвата содержимого экрана или самостоятельно написать приложение в.NET (но это не так просто).

Я использую: http://www.hmelyoff.com/index.php?section=9

РЕДАКТИРОВАТЬ: У меня нет образца или опыта работы с WME SDK. Но я бы порекомендовал пойти по маршруту DirectShow, чтобы избежать требования наличия WME в хост-системе, отсутствия поддержки для него и просто полезно знать DirectShow (или сделать это самостоятельно), а не какой-нибудь случайный API.

Чтобы использовать фильтр Hmelyoff, он работает так же, как веб-камера. Это просто еще один источник видеозахвата, доступный любому приложению, которое хочет вводить видео. Он работает, просто копируя часть буфера viedo в его выходной контакт в каждом кадре (используя функцию API, такую ​​как BitBlt).

Пример кода здесь.

Или, если вы хотите просто взаимодействовать с DirectShow, самый простой способ - использовать библиотеку для взаимодействия с COM. http://directshownet.sourceforge.net/ является хорошим.

РЕДАКТИРОВАТЬ еще раз: захват как видео аналогичен захвату кадров. Он просто захватывает кадры 30 раз в секунду. Процессор боров? Это не ожидать полной частоты кадров.

Если вы спрашиваете, как сохранить кадры как видео, то вам нужно будет передать данные в видеокодер. Вам нужно будет подключиться к DirectShow, чтобы сделать это.

Лучше всего будет импортировать библиотеки кодировщика Windows Media в виде com-интерфейса в ваше приложение.net и использовать его в своем приложении.

Вы можете использовать Microsoft Expression Encoder 4 как для записи видео, так и аудио. Это просто работает для меня с C#. Следующий код должен быть знаком.

void Encode(string jobPath)
    {
        using (Job j = new Job())
        {

            MediaItem mediaItem = new MediaItem(jobPath);
            var size = mediaItem.OriginalVideoSize;
            WindowsMediaOutputFormat WMV_Format = new WindowsMediaOutputFormat();
            WMV_Format.VideoProfile = new Microsoft.Expression.Encoder.Profiles.AdvancedVC1VideoProfile();
            WMV_Format.AudioProfile = new Microsoft.Expression.Encoder.Profiles.WmaAudioProfile();
            WMV_Format.VideoProfile.AspectRatio = new System.Windows.Size(16, 9);
            WMV_Format.VideoProfile.AutoFit = true;

            if (size.Width >= 1920 && size.Height >= 1080)
            {
                WMV_Format.VideoProfile.Size = new System.Drawing.Size(1920, 1080);
                WMV_Format.VideoProfile.Bitrate = new Microsoft.Expression.Encoder.Profiles.VariableUnconstrainedBitrate(6000);
            }
            else if (size.Width >= 1280 && size.Height >= 720)
            {
                WMV_Format.VideoProfile.Size = new System.Drawing.Size(1280, 720);
                WMV_Format.VideoProfile.Bitrate = new Microsoft.Expression.Encoder.Profiles.VariableUnconstrainedBitrate(4000);
            }
            else
            {
                WMV_Format.VideoProfile.Size = new System.Drawing.Size(size.Width, size.Height);
                WMV_Format.VideoProfile.Bitrate = new Microsoft.Expression.Encoder.Profiles.VariableUnconstrainedBitrate(2000);
            }
            mediaItem.VideoResizeMode = VideoResizeMode.Letterbox;
            mediaItem.OutputFormat = WMV_Format;
            j.MediaItems.Add(mediaItem);
            j.CreateSubfolder = false;
            j.OutputDirectory = @"D:\output";
            j.EncodeProgress += new EventHandler<EncodeProgressEventArgs>(j_EncodeProgress);
            j.Encode();
        }
    }

Да, это полностью выполнимо с WME: http://www.c-sharpcorner.com/UploadFile/armoghanasif/CaptureDesktopActivities11122005013755AM/CaptureDesktopActivities.aspx

Я делал это в прошлом, и вы можете получить видео очень хорошего качества, как только начнете изменять настройки кодирования. Особенно, если WMV является жизнеспособным вариантом для вас. Если нет, вам придется перекодировать в другой формат, используя другое приложение.

Самым простым способом, который я нашел для настройки, было использование настольного приложения WME для тестирования и записи с различными настройками, а также сохранение тех файлов конфигурации, которые я позже загрузил программно из своего приложения.

Другие вопросы по тегам