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

Для перекодировки видеофайлов из одного формата в другой можно использовать API-интерфейсы Windows. Media.You can use the Windows.Media.Transcoding APIs to transcode video files from one format to another.

Перекодирование — это преобразование файла цифрового мультимедиа, такого как видеофайл или звуковой файл, из одного формата в другой.Transcoding is the conversion of a digital media file, such as a video or audio file, from one format to another. Обычно этот процесс состоит из декодирования и повторного кодирования файла.This is usually done by decoding and then re-encoding the file. Например, файл Windows Media можно преобразовать в формат MP4, чтобы его можно было воспроизводить на портативном устройстве, поддерживающем данный формат.For example, you might convert a Windows Media file to MP4 so that it can be played on a portable device that supports MP4 format. Кроме того, можно преобразовать видеофайл высокой четкости, уменьшив его разрешение.Or, you might convert a high-definition video file to a lower resolution. В таком случае перекодированный файл может использовать тот же кодек, что и исходный файл, но с другим профилем кодирования.In that case, the re-encoded file might use the same codec as the original file, but it would have a different encoding profile.

Настройка проекта для перекодированияSet up your project for transcoding

Чтобы перекодировать файлы мультимедиа с помощью кода в данной статье, помимо пространств имен, на которые по умолчанию ссылается шаблон проекта, вам потребуется ссылаться на указанные ниже пространства имен.In addition to the namespaces referenced by the default project template, you will need to reference these namespaces in order to transcode media files using the code in this article.

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

Выбор исходного файла и файла назначенияSelect source and destination files

Способ, которым приложение будет определять исходный файлах и файл назначения для перекодирования, зависит от вашей реализации.The way that your app determines the source and destination files for transcoding depends on your implementation. В этом примере используются элементы управления FileOpenPicker и FileSavePicker, с помощью которых пользователь может выбрать исходный файл и файл назначения.This example uses a FileOpenPicker and a FileSavePicker to allow the user to pick a source and a destination file.

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

Создание профиля кодирования мультимедиаCreate a media encoding profile

Профиль кодирования содержит параметры, определяющие способ кодирования файла назначения.The encoding profile contains the settings that determine how the destination file will be encoded. Именно на этом этапе перекодирования файла выбор параметров наиболее велик.This is where you have the greatest number of options when you transcode a file.

Класс MediaEncodingProfile содержит статические методы для создания указанных ниже предопределенных профилей кодирования.The MediaEncodingProfile class provides static methods for creating predefined encoding profiles:

Методы для создания профилей кодирования только аудиоMethods for creating Audio-only encoding profiles

МетодMethod ПрофильProfile
CreateAlacCreateAlac Аудио Apple Lossless Audio Codec (ALAC)Apple Lossless Audio Codec (ALAC) audio
CreateFlacCreateFlac Аудио Free Lossless Audio Codec (FLAC).Free Lossless Audio Codec (FLAC) audio.
CreateM4aCreateM4a Звуковые файлы в формате AAC (M4A)AAC audio (M4A)
CreateMp3CreateMp3 Звуковые файлы в формате MP3MP3 audio
CreateWavCreateWav Звуковые файлы в формате WAVWAV audio
CreateWmvCreateWmv Звуковые файлы в формате WMAWindows Media Audio (WMA)

Методы для создания профилей кодирования аудио/видеоMethods for creating audio / video encoding profiles

МетодMethod ПрофильProfile
CreateAviCreateAvi AVIAVI
CreateHevcCreateHevc Видео High Efficiency Video Coding (HEVC), известное также как видео H.265High Efficiency Video Coding (HEVC) video, also known as H.265 video
CreateMp4CreateMp4 Видеофайлы в формате MP4 (видео в формате H.264 и звук в формате AAC)MP4 video (H.264 video plus AAC audio)
CreateWmvCreateWmv Видеофайлы в формате WMVWindows Media Video (WMV)

Указанный ниже фрагмент кода используется для создания профиля видеофайла в формате MP4.The following code creates a profile for MP4 video.

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

Статический метод CreateMp4 создает профиль кодирования для MP4.The static CreateMp4 method creates an MP4 encoding profile. Параметр этого метода задает конечное разрешение видеофайла.The parameter for this method gives the target resolution for the video. В данном случае VideoEncodingQuality.hd720p означает разрешение 1280 x 720 пикселей со скоростью 30 кадров в секундуIn this case, VideoEncodingQuality.hd720p means 1280 x 720 pixels at 30 frames per second. ("720p" означает 720 строк прогрессивной развертки на один кадр). Все остальные методы создания предопределенных профилей работают по тому же принципу.("720p" stands for 720 progressive scan lines per frame.) The other methods for creating predefined profiles all follow this pattern.

В качестве альтернативы с помощью метода MediaEncodingProfile.CreateFromFileAsync можно создать профиль, который соответствует существующему файлу мультимедиа.Alternatively, you can create a profile that matches an existing media file by using the MediaEncodingProfile.CreateFromFileAsync method. Если же вам известны точные параметры кодирования, то можно создать новый объект MediaEncodingProfile и настроить для него профиль.Or, if you know the exact encoding settings that you want, you can create a new MediaEncodingProfile object and fill in the profile details.

Перекодировка файлаTranscode the file

Чтобы перекодировать файл, создайте новый объект MediaTranscoder и вызовите метод MediaTranscoder.PrepareFileTranscodeAsync.To transcode the file, create a new MediaTranscoder object and call the MediaTranscoder.PrepareFileTranscodeAsync method. В качестве параметров задайте исходный файл, конечный файл и профиль кодирования.Pass in the source file, the destination file, and the encoding profile. Затем вызовите метод TranscodeAsync для объекта PrepareTranscodeResult, возвращенного в результате выполнения операции асинхронного перекодирования.Then call the TranscodeAsync method on the PrepareTranscodeResult object that was returned from the async transcode operation.

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;
    }
}

Реакция на ход выполнения перекодированияRespond to transcoding progress

Вы можете регистрировать события, чтобы реагировать на изменения в ходе выполнения асинхронного TranscodeAsync.You can register events to respond when the progress of the asynchronous TranscodeAsync changes. Эти события — часть платформы асинхронного программирования для приложений универсальной платформы Windows (UWP) и не зависят от API перекодирования.These events are part of the async programming framework for Universal Windows Platform (UWP) apps and are not specific to the transcoding 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.
    }
}