【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可以在功能键和多媒体键之间切换.
随机推荐
- 理解加密算法(三)——创建CA机构,签发证书并开始TLS通信
接理解加密算法(一)--加密算法分类.理解加密算法(二)--TLS/SSL 1 不安全的TCP通信 普通的TCP通信数据是明文传输的,所以存在数据泄露和被篡改的风险,我们可以写一段测试代码试验一下. ...
- ABP文档 - Javascript Api
文档目录 本节内容: AJAX Notification Message UI Block & Busy Event Bus Logging Other Utility Functions A ...
- jQuery学习之路(3)- 事件
▓▓▓▓▓▓ 大致介绍 jQuery增加了并扩展了基本的事件处理机制,不但提供了更加优雅的事件处理语法,而且极大地增强了事件处理能力 ▓▓▓▓▓▓ jQuery中的事件 ▓▓▓▓▓▓ 加载DOM 在j ...
- C++11特性——变量部分(using类型别名、constexpr常量表达式、auto类型推断、nullptr空指针等)
#include <iostream> using namespace std; int main() { using cullptr = const unsigned long long ...
- 一起学 Java(二)面向对象
一.方法函数 函数也称为方法,就是定义在类中的具有特定功能的一段独立代码.用于定义功能,提高代码的复用性. 函数的特点1> 定义函数可以将功能代码进行封装,便于对该功能进行复用:2> 函数 ...
- VS项目中使用Nuget还原包后编译生产还一直报错?
Nuget官网下载Nuget项目包的命令地址:https://www.nuget.org/packages 今天就遇到一个比较奇葩的问题,折腾了很久终于搞定了: 问题是这样的:我的解决方案原本是好好的 ...
- 浅谈Slick(2)- Slick101:第一个动手尝试的项目
看完Slick官方网站上关于Slick3.1.1技术文档后决定开始动手建一个项目来尝试一下Slick功能的具体使用方法.我把这个过程中的一些了解和想法记录下来和大家一起分享.首先我用IntelliJ- ...
- Android之SAX解析XML
一.SAX解析方法介绍 SAX(Simple API for XML)是一个解析速度快并且占用内存少的XML解析器,非常适合用于Android等移动设备. SAX解析器是一种基于事件的解析器,事件驱动 ...
- 在MySQL数据库中创建一个完整的表
1.登陆成功后,首先进入某一个数据库 (不是指数据库服务器) use t1; //t1是数据库名 如图所示: 2.在此数据库中建立数据库表 2.1 先建立表结构(可以理解为表的列名,也就是字段名)在实 ...
- 烂泥:redis3.2.3安装与配置
本文由ilanniweb提供友情赞助,首发于烂泥行天下 想要获得更多的文章,可以关注我的微信ilanniweb 前一段时间写过一篇codis集群的文章,写那篇文章主要是因为当时的项目不支持redis自 ...