上次本来说好,今天咱们来讨论 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 == ) //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就别做梦了,毕竟已经过时的格式。

示例源代码下载

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

哦,差点忘了讲故事。

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

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

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

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

【Win 10 应用开发】多媒体转码的更多相关文章

  1. 【Win 10 应用开发】在后台进行多媒体转码

    前面,老周给大伙儿讲了如何运用 MediaTranscoder 类来完成多媒体.然而,你懂的,要是多媒体文件比较大,转码时间会更长,有可能用户不会一眭停在当前应用界面上,或许会切换到其他应用程序,甚至 ...

  2. 【Win 10应用开发】Adaptive磁贴模板的XML文档结构

    在若干天之前,老周给大家讲了Adaptive Toast通知的XML模板,所以相应地,今天老周给大家介绍一下Adaptive磁贴的新XML模板. 同样道理,你依旧可以使用8.1时候的磁贴模板,在win ...

  3. 【Win 10 应用开发】启动远程设备上的应用

    这个功能必须在“红石-1”(build 14393)以上的系统版中才能使用,运行在一台设备上的应用,可以通过URI来启动另一台设备上的应用.激活远程应用需要以下前提: 系统必须是build 14393 ...

  4. 【Win 10 应用开发】导入.pfx证书

    这个功能其实并不常用,一般开发较少涉及到证书,不过,简单了解一下还是有必要的. 先来说说制作测试证书的方法,这里老周讲两种方法,可以生成用于测试的.pfx文件. 产生证书,大家都知道有个makecer ...

  5. 【Win 10 应用开发】RTM版的UAP项目解剖

    Windows 10 发布后,其实SDK也偷偷地在VS的自定义安装列表中出现了,今天开发人员中心也更新了下载.正式版的SDK在API结构上和以前预览的时候是一样的,只是版本变成10240罢了,所以大家 ...

  6. 【Win 10 应用开发】Toast通知激活应用——前台&后台

    老周最近热衷于讲故事,接下来还是讲故事时间. 有人问我:你上大学的时候,有加入过学生会吗?读大学有没有必要加入学生会? 哎哟,这怎么回答呢,从短期来说,加入学生会有点用,至少可以娱乐一下,运气好的话, ...

  7. 【Win 10应用开发】认识一下UAP项目

    Windows 10 SDK预览版需要10030以上版本号的Win 10预览版系统才能使用.之前我安装的9926的系统,然后安装VS 2015 CTP 6,再装Win 10 SDK,但是在新建项目后, ...

  8. 【Win 10 应用开发】在代码中加载文本资源

    记得前一次,老周给大伙,不,小伙伴们介绍了如何填写 .resw 文件,并且在 XAML 中使用 x:Uid 标记来加载.也顺便给大伙儿分析了运行时是如何解析 .resw 文件的. 本来说好了,后续老周 ...

  9. dell win 10笔记本关闭多媒体键,启用功能键的快捷方式

    自从使用win 10之后,在使用快捷键方面就没有win 7之前来的顺手,比如F8切换投影仪,F5/F6调试等等.特地搜了下,使用Fn+Esc可以在功能键和多媒体键之间切换.

随机推荐

  1. Android指纹解锁

    Android6.0及以上系统支持指纹识别解锁功能:项目中用到,特此抽离出来,备忘. 功能是这样的:在用户将app切换到后台运行(超过一定的时长,比方说30秒),再进入程序中的时候就会弹出指纹识别的界 ...

  2. 从中间件的历史来看移动App开发的未来

    在移动开发领域我们发现一个很奇怪的现象:普通菜鸟新手经过3个月的培训就可以拿到 8K 甚至上万的工作:在北京稍微有点工作经验的 iOS 开发,就要求 2 万一个月的工资.不知道大家是否想过:移动应用开 ...

  3. Android笔记——Button点击事件几种写法

    Button点击事件:大概可以分为以下几种: 匿名内部类 定义内部类,实现OnClickListener接口 定义的构造方法 用Activity实现OnClickListener接口 指定Button ...

  4. 如何正确使用日志Log

    title: 如何正确使用日志Log date: 2015-01-08 12:54:46 categories: [Python] tags: [Python,log] --- 文章首发地址:http ...

  5. 学习ASP.NET Core,怎能不了解请求处理管道[1]: 中间件究竟是个什么东西?

    ASP.NET Core管道虽然在结构组成上显得非常简单,但是在具体实现上却涉及到太多的对象,所以我们在 "通过重建Hosting系统理解HTTP请求在ASP.NET Core管道中的处理流 ...

  6. MVC CodeFirst简单的创建数据库(非常详细的步骤)

       最近在学习MVC的开发,相信有过开发经验的人初学一个新的框架时候的想法跟我一样最关心的就是这个框架如何架构,每个架构如何分工,以及最最关键的就是如何与数据库通信,再下来才是学习基础的页面设计啊等 ...

  7. XML技术之DOM4J解析器

    由于DOM技术的解析,存在很多缺陷,比如内存溢出,解析速度慢等问题,所以就出现了DOM4J解析技术,DOM4J技术的出现大大改进了DOM解析技术的缺陷. 使用DOM4J技术解析XML文件的步骤? pu ...

  8. PHP之用户验证和标签推荐的简单使用

    本篇主要是讲解一些最简单的验证知识 效果图 bookmark_fns.php <?php require_once('output_fns.php'); require_once('db_fns ...

  9. $ORACLE_HOME变量值末尾多“/”惹的祸

    之前一直误以为$ORACLE_HOME变量的路径中末尾多写一个"/"不会有影响. 今天做实验时碰到一个情景,发现并不是这样. 环境:OEL 5.7 + Oracle 10.2.0. ...

  10. Could not evaluate expression

    VS15 调试变量不能显示值,提示:Could not evaluate expression 解决办法: 选择"在调试时显示运行以单击编辑器中的按钮"重启VS即可. 可参考:Vi ...