转换媒体文件代码
可以使用 Windows.Media.Transcoding API 将视频文件代码从一种格式转换为另一种格式。
转换代码是指转换数字媒体文件,例如将视频或音频文件从一种格式转换为另一种格式。 这通常是通过解码文件,然后再重新编码文件实现的。 例如,你可以将 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 类提供用于创建预定义编码配置文件的静态方法:
用于创建纯音频编码配置文件的方法
方法 | 配置文件 |
---|---|
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.
}
}