【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 == ) //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 应用开发】多媒体转码的更多相关文章
- 【Win 10 应用开发】在后台进行多媒体转码
前面,老周给大伙儿讲了如何运用 MediaTranscoder 类来完成多媒体.然而,你懂的,要是多媒体文件比较大,转码时间会更长,有可能用户不会一眭停在当前应用界面上,或许会切换到其他应用程序,甚至 ...
- 【Win 10应用开发】Adaptive磁贴模板的XML文档结构
在若干天之前,老周给大家讲了Adaptive Toast通知的XML模板,所以相应地,今天老周给大家介绍一下Adaptive磁贴的新XML模板. 同样道理,你依旧可以使用8.1时候的磁贴模板,在win ...
- 【Win 10 应用开发】启动远程设备上的应用
这个功能必须在“红石-1”(build 14393)以上的系统版中才能使用,运行在一台设备上的应用,可以通过URI来启动另一台设备上的应用.激活远程应用需要以下前提: 系统必须是build 14393 ...
- 【Win 10 应用开发】导入.pfx证书
这个功能其实并不常用,一般开发较少涉及到证书,不过,简单了解一下还是有必要的. 先来说说制作测试证书的方法,这里老周讲两种方法,可以生成用于测试的.pfx文件. 产生证书,大家都知道有个makecer ...
- 【Win 10 应用开发】RTM版的UAP项目解剖
Windows 10 发布后,其实SDK也偷偷地在VS的自定义安装列表中出现了,今天开发人员中心也更新了下载.正式版的SDK在API结构上和以前预览的时候是一样的,只是版本变成10240罢了,所以大家 ...
- 【Win 10 应用开发】Toast通知激活应用——前台&后台
老周最近热衷于讲故事,接下来还是讲故事时间. 有人问我:你上大学的时候,有加入过学生会吗?读大学有没有必要加入学生会? 哎哟,这怎么回答呢,从短期来说,加入学生会有点用,至少可以娱乐一下,运气好的话, ...
- 【Win 10应用开发】认识一下UAP项目
Windows 10 SDK预览版需要10030以上版本号的Win 10预览版系统才能使用.之前我安装的9926的系统,然后安装VS 2015 CTP 6,再装Win 10 SDK,但是在新建项目后, ...
- 【Win 10 应用开发】在代码中加载文本资源
记得前一次,老周给大伙,不,小伙伴们介绍了如何填写 .resw 文件,并且在 XAML 中使用 x:Uid 标记来加载.也顺便给大伙儿分析了运行时是如何解析 .resw 文件的. 本来说好了,后续老周 ...
- dell win 10笔记本关闭多媒体键,启用功能键的快捷方式
自从使用win 10之后,在使用快捷键方面就没有win 7之前来的顺手,比如F8切换投影仪,F5/F6调试等等.特地搜了下,使用Fn+Esc可以在功能键和多媒体键之间切换.
随机推荐
- opencv在图像显示中文
在图像定位和模式识别时,经常需要把结果标注到图片上,标注内容可以是数字字母.矩形框等(opencv支持的)或者是中文汉字(借助freetype). 1.显示数字/矩形框 #include <op ...
- [原] KVM 虚拟化原理探究(1)— overview
KVM 虚拟化原理探究- overview 标签(空格分隔): KVM 写在前面的话 本文不介绍kvm和qemu的基本安装操作,希望读者具有一定的KVM实践经验.同时希望借此系列博客,能够对KVM底层 ...
- Asp.net MVC 传递数据 从前台到后台,包括单个对象,多个对象,集合
今天为大家分享下 Asp.net MVC 将数据从前台传递到后台的几种方式. 环境:VS2013,MVC5.0框架 1.基本数据类型 我们常见有传递 int, string, bool, double ...
- ExtJS 4.2 组件介绍
目录 1. 介绍 1.1 说明 1.2 组件分类 1.3 组件名称 1.4 组件结构 2. 组件的创建方式 2.1 Ext.create()创建 2.2 xtype创建 1. 介绍 1.1 说明 Ex ...
- ASP.NET MVC开发日常一:SessionID合理清除
在MVC Web开发中临时存储数据一般会用到Session,Cookie,ViewBag,ViewData,TempData.每个的使用场景是不同,具体区别有空再补上. Session数据最敏感,最需 ...
- 浅谈JSP中include指令与include动作标识的区别
JSP中主要包含三大指令,分别是page,include,taglib.本篇主要提及include指令. include指令使用格式:<%@ include file="文件的绝对路径 ...
- JavaScript中String对象的方法介绍
1.字符方法 1.1 charAt() 方法,返回字符串中指定位置的字符. var question = "Do you like JavaScript?"; alert(ques ...
- ES6之let命令详解
let与块级作用域 { var foo='foo'; let bar='bar'; } console.log(foo,'var'); //foo varconsole.log(bar ,'bar') ...
- BPM配置故事之案例13-触发消息通知
老李:小明! 小明:--见你就没好事,又要我干嘛? 老李:额,小事小事,最近很多部门都觉得Boss的审批速度太慢了,能不能以后给审批人一个消息提醒? 小明:--有一种不太好的预感 老李:怎么,很困难么 ...
- iOS - 模态Model视图跳转和Push视图跳转的混合需求实现原理
在研发中总会遇到一些莫名的需求,本着存在即合理的态度跟大家分享一下"模态Model视图跳转和Push视图跳转的需求实现",本文仅仅传授研发技术不传授产品以及UE的思想,请大家合理对 ...