Windows.Media.Transcoding命名空间下提供了相关API,支持对音/视频文件进行转码处理。这些API已经由官方封装好,使用起来比较方便。
通俗一点说,多媒体文件转码就是将音/视频文件从一种格式转换为另一种格式,如将AVI格式的视频转换为MP4格式的视频。实现多媒体转码的一般步骤如下:
(1). 实例化MediaTranscoder对象。
(2). 调用PrepareXXXTranscoderAsync方法,异步等待执行后会得到一个PrepareTranscodeResult对象实例,其中,XXX可以指代MediaTranscoder类的三个方法:PrepareFileTranscodeAsync、PrepareMediaStreamSourceTranscodeAsync和PrepareStreamTranscodeAsync方法。针对不同的多媒体来源调用对应的方法,假设源媒体与目标媒体都是以流的方式操作的,则调用PrepareStreamTranscodeAsync方法,如果PrepareTranscodeResult实例的CanTranscode属性返回True,表示可以进行转码,否则不能进行转码。因此在调用TranscodeAsync方法开始转码之前,一定要先判断一下该属性是否为true。
下面示例将演示如何将位于应用程序项目中的一个MP3音频文件转换为M4A音频文件。
应用程序主页面上的XAML代码如下:
<StackPanel Margin="20">
<ProgressBar x:Name="pb" Width="200" Height="20" Foreground="LightPink" Maximum="100"
Minimum="0" HorizontalAlignment="Left"/>
<Button Content="开始转码" Tapped="Button_Tapped" Margin="0,10"/>
</StackPanel>
ProgressBar控件用于实时显示转码处理的进度。下面代码处理"开始转码"按钮的Tapped事件:
private async void Button_Tapped(object sender, TappedRoutedEventArgs e)
{
Button btn = sender as Button;
btn.IsEnabled = false;
//从项目目录中获取待转码的.mp3文件
//Uri sourceFileUri = new Uri("ms-appx:///Assets/sample_audio.mp3");
//StorageFile srcFile = await StorageFile.GetFileFromApplicationUriAsync(sourceFileUri);
FileOpenPicker picker = new FileOpenPicker();
picker.SuggestedStartLocation = PickerLocationId.VideosLibrary;
picker.FileTypeFilter.Add(".mp3");
var srcFile = await picker.PickSingleFileAsync();
if (srcFile == null)
{
return;
}
获取"音乐"文件目录
//StorageFolder musicFd = KnownFolders.MusicLibrary;
新文件名
//string newFileName = "new_file.m4a";
//StorageFile disFile = await musicFd.CreateFileAsync(newFileName, CreationCollisionOption.ReplaceExisting);
FileSavePicker savePicker = new FileSavePicker();
savePicker.SuggestedStartLocation = PickerLocationId.VideosLibrary;
savePicker.SuggestedFileName = "Test File";
savePicker.FileTypeChoices.Add("M4a",new string[] { ".m4a"});
var disFile = await savePicker.PickSaveFileAsync();
if (disFile == null)
{
return;
}
//响应转码处理进度
IProgress<double> progress = new Progress<double>(p=>
{
//更新进度
pb.Value = p;
});
//实例化MediaTranscoder对象
MediaTranscoder transcoder = new MediaTranscoder();
PrepareTranscodeResult result = await transcoder.PrepareFileTranscodeAsync(srcFile,disFile,
MediaEncodingProfile.CreateAvi(VideoEncodingQuality.Auto));
//开始转码
if (result.CanTranscode)
{
await result.TranscodeAsync().AsTask(progress);
}
btn.IsEnabled = true;
}
需要注意的是,PreapreTranscodeResult类的TranscodeAsync方法返回的类型是IAsyncActionWithProgress<double>,如果运用await关键字异步等待后并不会返回转码处理的实时进度。为了能够获取实时进度,需要通过一个名为AsTask的扩展方法让其转换为Task类型的异步任务,同时以一个IProgress<T>对象来接收进度更新,它由Progress<T>类实现,并且绑定一个委托对象来传递进度值。即:
//响应转码处理进度
IProgress<double> progress = new Progress<double>(p=>
{
//更新进度
pb.Value = p;
});
从委托传递进来的变量p就是转码处理的实时进度,将值赋给ProgressBar控件的Value属性就可以更新用户界面上的进度条。
读者需要向应用程序项目添加一个待测试的MP3文件。然后在应用程序清单文件可视化界面中,勾选上"音乐库"功能,以获得访问音乐库的权限。