Перекодирование файлов мультимедиа

Вы можете использовать Windows. Media.Transcoding API для перекодирования видеофайлов из одного формата в другой.

Транскодирование — это преобразование цифрового файла мультимедиа, например видео или аудиофайла из одного формата в другой. Обычно это делается путем декодирования и повторного кодирования файла. Например, можно преобразовать файл мультимедиа Windows в MP4, чтобы его можно было воспроизвести на переносимом устройстве, поддерживающем формат MP4. Кроме того, можно преобразовать видеофайл высокой четкости в более низкое разрешение. В этом случае повторно закодированный файл может использовать тот же кодек, что и исходный файл, но он будет иметь другой профиль кодирования.

Выбор исходных и целевых файлов

Способ определения исходных и целевых файлов для перекодирования зависит от реализации. В этом примере используется FileOpenPicker и FileSavePicker для выбора источника и целевого файла.

var openPicker = new Windows.Storage.Pickers.FileOpenPicker();

// Initialize the picker with the window handle (required for WinUI desktop apps).
var hwnd = WinRT.Interop.WindowNative.GetWindowHandle(App.MainWindow);
WinRT.Interop.InitializeWithWindow.Initialize(openPicker, hwnd);

openPicker.SuggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.VideosLibrary;
openPicker.FileTypeFilter.Add(".wmv");
openPicker.FileTypeFilter.Add(".mp4");

StorageFile source = await openPicker.PickSingleFileAsync();

var savePicker = new Windows.Storage.Pickers.FileSavePicker();

WinRT.Interop.InitializeWithWindow.Initialize(savePicker, hwnd);

savePicker.SuggestedStartLocation =
    Windows.Storage.Pickers.PickerLocationId.VideosLibrary;

savePicker.DefaultFileExtension = ".mp4";
savePicker.SuggestedFileName = "New Video";

savePicker.FileTypeChoices.Add("MPEG4", new string[] { ".mp4" });

StorageFile destination = await savePicker.PickSaveFileAsync();

Создание профиля кодирования мультимедиа

Профиль кодирования содержит параметры, определяющие способ кодирования целевого файла. В этом случае при перекодировки файла у вас есть наибольшее количество параметров.

Класс MediaEncodingProfile предоставляет статические методы для создания предопределенных профилей кодирования:

Методы создания профилей кодирования только для аудио

Метод Profile
CreateAlac Аудио Apple Lossless Audio Codec (ALAC)
CreateFlac Аудио в формате FLAC
CreateM4a Звук AAC (M4A)
CreateMp3 Звук MP3
CreateWav Звук WAV
CreateWma Windows Media Audio (WMA)

Методы создания профилей кодирования аудио и видео

Метод Profile
CreateAv1 Видео AOMedia Video 1 (AV1)
CreateAvi AVI
CreateHevc Видео в формате Высокоэффективного кодирования видео (HEVC), также известное как видео H.265
CreateMp4 Видео MP4 (видео H.264 и звук AAC)
CreateVp9 Видео VP9
CreateWmv Windows Media Video (WMV)

Следующий код создает профиль для видео MP4.

MediaEncodingProfile profile =
    MediaEncodingProfile.CreateMp4(VideoEncodingQuality.HD720p);

Статический метод CreateMp4 создает профиль кодирования MP4. Параметр для этого метода предоставляет целевое разрешение для видео. В этом случае VideoEncodingQuality.hd720p означает 1280 x 720 пикселей в 30 кадров в секунду. ("720p" означает 720 прогрессивных линий сканирования на кадр.) Другие методы создания предопределенных профилей соответствуют этому шаблону.

Кроме того, можно создать профиль, соответствующий существующему файлу мультимедиа, с помощью метода MediaEncodingProfile.CreateFromFileAsync . Или, если вы знаете точные параметры кодирования, можно создать новый объект MediaEncodingProfile и заполнить сведения о профиле.

Перекодирование файла

Чтобы перекодировать файл, создайте объект MediaTranscoder и вызовите метод MediaTranscoder.PrepareFileTranscodeAsync. Передайте исходный файл, целевой файл и профиль кодирования. Затем вызовите метод TranscodeAsync для объекта PrepareTranscodeResult, возвращенного из асинхронной операции транскода.

MediaTranscoder transcoder = new MediaTranscoder();

PrepareTranscodeResult prepareOp = await
    transcoder.PrepareFileTranscodeAsync(source, destination, profile);

if (prepareOp.CanTranscode)
{
    var transcodeOp = prepareOp.TranscodeAsync();

    transcodeOp.Progress +=
        new AsyncActionProgressHandler<double>(TranscodeProgress);
    transcodeOp.Completed +=
        new AsyncActionWithProgressCompletedHandler<double>(TranscodeComplete);
}
else
{
    switch (prepareOp.FailureReason)
    {
        case TranscodeFailureReason.CodecNotFound:
            System.Diagnostics.Debug.WriteLine("Codec not found.");
            break;
        case TranscodeFailureReason.InvalidProfile:
            System.Diagnostics.Debug.WriteLine("Invalid profile.");
            break;
        default:
            System.Diagnostics.Debug.WriteLine("Unknown failure.");
            break;
    }
}

Реагирование на ход выполнения перекодирования

Вы можете зарегистрировать события, чтобы реагировать на изменение хода выполнения асинхронной операции TranscodeAsync. Эти события являются частью асинхронной платформы программирования для приложений Windows и не относятся к API транскодирования.

void TranscodeProgress(IAsyncActionWithProgress<double> asyncInfo, double percent)
{
    // Display or handle progress info.
}

void TranscodeComplete(IAsyncActionWithProgress<double> asyncInfo, AsyncStatus status)
{
    asyncInfo.GetResults();
    if (asyncInfo.Status == AsyncStatus.Completed)
    {
        // Display or handle complete info.
    }
    else if (asyncInfo.Status == AsyncStatus.Canceled)
    {
        // Display or handle cancel info.
    }
    else
    {
        // Display or handle error info.
    }
}