转码媒体文件

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

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

选择源文件和目标文件

应用确定转码的源文件和目标文件的方式取决于实现。 此示例使用 FileOpenPickerFileSavePicker 允许用户选取源和目标文件。

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 无损音频编解码器(ALAC)音频
CreateFlac 免费无损失音频编解码器 (FLAC) 音频
CreateM4a AAC 音频 (M4A)
CreateMp3 MP3 音频
CreateWav WAV 音频
CreateWma Windows媒体音频(WMA)

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

方法 Profile
CreateAv1 AOMedia Video 1 (AV1) 视频
CreateAvi AVI
CreateHevc 高效视频编码(HEVC)视频,也称为 H.265 视频
CreateMp4 MP4 视频 (H.264 视频和 AAC 音频)
CreateVp9 VP9 视频
CreateWmv Windows媒体视频(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应用的异步编程框架的一部分,并不特定于转码 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.
    }
}