可以使用 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 无损音频编解码器(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.
}
}