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

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

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

Настройка проекта для перекодирования

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

using Windows.Storage;
using Windows.Media.MediaProperties;
using Windows.Media.Transcoding;

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

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

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

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();

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
CreateWmv Звук Windows Media (WMA)

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

Метод Profile
CreateAvi AVI
CreateHevc Видео с высоким уровнем эффективности (HEVC), также известное как видео H.265
CreateMp4 Видео MP4 (видео H.264 и звук AAC)
CreateWmv Видео Windows Media (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 (UWP) и не относятся к 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.
    }
}