• 【Win 10 应用开发】多媒体转码


    上次本来说好,今天咱们来讨论 socket 相关的话题,但,对于 socket ,老周还有一些问题没弄清楚,等弄清楚了,再和大伙伴们一起探讨。故,今天咱们扯一扯多媒体转码的事。

    听起来挺复杂的,不过,由于有现成的API,使得在UWP中完成转码并不算复杂,我一说,大家就会懂的。

    不说F话,直入正题吧。多媒体转码相关的API在 Windows.Media.Transcoding 命名空间下,具体的使用步骤如下:

    a、new一个MediaTranscoder实例,不用教你了吧。

    b、正常情况下,不用修改什么属性,直接可以干活。调用 PrepareXXXXTranscodeAsync 方法做好转码操作的准备。如果输入/输出的是媒体文件(如MP4、MP3、WMV、Mkv等),那就调用PrepareFileTranscodeAsync方法;如果是以流的形式输入/输出的,就调用PrepareStreamTranscodeAsync方法。

    c、调用 PrepareXXXXXXX后,会得到一个 PrepareTranscodeResult 实例,注意啊,此时转码操作还没开始呢,别兴奋得太早了,此前只是分析阶段,看看你输入的文件的人品够不够格,如果够格就可以转码,不够格就没办法了。实际上是分析系统当前所支持的解码/编码器。

    d、访问 PrepareTranscodeResult 对象的 CanTranscode 属性以确定能不能转码,你要确认它返回 true 才能进行转码。要想知道无法转码的原因,可以访问FailureReason属性,它是个枚举值,我就不一一说了,看名字就懂的,不懂就查字典。

    e、确认可以转码后,调用 PrepareTranscodeResult对象的 TranscodeAsync() 方法,就会开始转码了,这是可以异步等待的方法,别问我是啥,回家复习一下 C# 5 新特性就明白了。

    由于转码的过程较长,具体看文件类型,反正我转码一集电视剧的mkv文件为mp4文件,用了15分钟左右,可能是我的电脑配置拖了后腿。所以,最好可以监测转码的进度,并在用户界面上实时显示处理进度,不然的话,不懂事的小孩子会以为你的程序挂了。

    比较提升人品的做法是调用AsTask扩展方法,把基于RT的异步操作转化为基于.NET的Task模型的操作,这样一来,既可以用.net中的Progress<T>来报告进度,用CancellationTokenSource来取消操作。

    放心,后面老周会给大伙上核心代码,其他代码的话,自己下载示例源码看吧,看懂了不要问我,看不懂也不要问我。

    看,启动转码操作的代码如下:

                int n = cmbOutputFmt.SelectedIndex;
                MediaEncodingProfile profile = null;
                if (n == 0) //mp4
                    profile = MediaEncodingProfile.CreateMp4(VideoEncodingQuality.HD720p);
                else   // wmv
                    profile = MediaEncodingProfile.CreateWmv(VideoEncodingQuality.HD720p);
                // 开始转码
                btnSelInputfile.IsEnabled = btnSelOutputfile.IsEnabled = btnTranscode.IsEnabled = false;
                btnCancelTranscode.IsEnabled = true;
    
                var prptransres = await transcoder.PrepareFileTranscodeAsync(inputFile, outputFile, profile);
                if (prptransres.CanTranscode)
                {
                    if (canceltsrc != null)
                    {
                        canceltsrc.Dispose();
                        canceltsrc = null;
                    }
                    canceltsrc = new CancellationTokenSource();
                    var progress = new Progress<double>(ps =>
                    {
                        tbmsg.Text = $"当前处理进度:{ps:N0}%";
                    });
                    await prptransres.TranscodeAsync().AsTask(canceltsrc.Token, progress);
                    tbmsg.Text = "转码完成。";
                }
                else
                {
                    tbmsg.Text = "此格式暂不受支持。";
                }


    注意,在调用PrepareFileTranscodeAsync方法时,需要提供一个MediaEncodingProfile实例,这个家伙用来干吗?它用来描述转码的目标类型的属性的配置,记住,是描述输出媒体的格式,不是输入媒体。

    比如我要把一个视频文件转码为一个.mp4文件,那么这个参数就要一个描述MP4的配置信息,使用CreateMp4静态方法可以直接获得实例。

    要取消转码过程,可以调用CancellationTokenSource实例的Cancel方法,调用后会取消操作,当会得到一个异常,在调试时会抛出,在直接运行时你自己想办法过滤。

    好,重点知识讲完了,其他代码不重要,可以自行查看示例项目。

    看看运行结果,老周拿出收藏多年的六小龄童版《西游记》电视剧来转换为MP4。如图。

    这些转码API支持输入.mkv、.avi、.mov、.asf、.flac等文件格式,至于说.ra和.rmvb就别做梦了,毕竟已经过时的格式。

    示例源代码下载

    ===========================================================

    哦,差点忘了讲故事。

    有人会问,老周,你不编程的时候,平时都干些什么。

    编程是职业,至于业余嘛,老周干的事情可多了,只要不违法,不违德的事都可以干。有人找我去玩就去耍耍,如果没人找我玩,就在家自己耍,听音乐、看书、诗词歌赋、写字涂鸦,笛子瑶琴电子琴,看电视看新闻。反正,家里能找得出来的东西都能耍,晚上睡觉前可以看恐怖片。

    实在闷得很就独自出去散步,什么广场、公园、电脑城、手机店、古玩市场、画廓、文具店、影剧院,都可以去耍耍。

    总之一句话——生活充实得很。

  • 相关阅读:
    H5及微信中唤起app的解决方案
    html5统计数据上报API:SendBeacon
    基于webpack4的react开发环境配置
    electron-vue开发爬坑指南
    利用git 进行多人协作开发
    js 性能优化利器:prepack
    各种渲染方式对比解析
    Nuxt.js部署应用的方式
    微信小程序--data的赋值与取值
    甘超波:什么是个人定位
  • 原文地址:https://www.cnblogs.com/tcjiaan/p/5247947.html
Copyright © 2020-2023  润新知