转码

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文件。然后在应用程序清单文件可视化界面中,勾选上"音乐库"功能,以获得访问音乐库的权限。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值