转换媒体文件代码

可以使用 Windows.Media.Transcoding API 将视频文件代码从一种格式转换为另一种格式。

转换代码是指转换数字媒体文件,例如将视频或音频文件从一种格式转换为另一种格式。 这通常是通过解码文件,然后再重新编码文件实现的。 例如,你可以将 Windows Media 文件转换为 MP4 文件,以使此文件可以在支持 MP4 格式的便携式设备上播放。 或者,你可以将高清视频文件转换为较低分辨率的文件。 在此情况下,重新编码的文件可能使用与原始文件相同的编解码器,但是其编码配置文件不同。

设置你的项目以进行转换代码

除了由默认项目模板引用的命名空间,你还需要引用这些命名空间,以便使用本文中的代码转换媒体文件代码。

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

选择源文件和目标文件

应用确定要转换代码的源文件和目标文件的方式取决于实现。 此示例通过使用 FileOpenPickerFileSavePicker 让用户能够选取源文件和目标文件。

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 类提供用于创建预定义编码配置文件的静态方法:

用于创建纯音频编码配置文件的方法

方法 配置文件
CreateAlac Apple 无损音频编解码器 (ALAC) 音频
CreateFlac 免费无损音频编解码器 (FLAC) 音频。
CreateM4a AAC 音频 (M4A)
CreateMp3 MP3 音频
CreateWav WAV 音频
CreateWmv Windows Media 音频 (WMA)

用于创建音频/视频编码配置文件的方法

方法 配置文件
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 表示在每秒 30 帧情况下的 1280 x 720 像素。 (“720p”表示每帧 720 个逐行扫描行。)用于创建预定义配置文件的其他方法均遵循此模式。

或者,你可以通过使用 MediaEncodingProfile.CreateFromFileAsync 方法来创建与现有媒体文件相匹配的配置文件。 或者,如果你知道所需的确切编码设置,则可以创建一个新的 MediaEncodingProfile 对象,然后填写配置文件详细信息。

转换文件代码

若要转码文件,请创建新的 MediaTranscoder 对象并调用 MediaTranscoder.PrepareFileTranscodeAsync 方法。 传入源文件、目标文件和编码配置文件。 然后,调用从异步转换代码操作中返回的 PrepareTranscodeResult 对象上的 TranscodeAsync 方法。

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