[连载]《C#通信(串口和互联网)框架的设计与贯彻》- 9.插件引擎陈设

目       录

关于直播的技术文章不少,成种类的不多。咱们将用七篇小说,更系统化地介绍当下大热的视频直播各环节的关键技术,协理视频直播创业者们更宏观、深刻地打听视频直播技术,更好地技术选型。

第天问           插件引擎设计… 2

录像编码是摄像直播技术多元小说的第三篇,是本体系一个万分首要的一部分,是活动支付必修的根底课程,本篇作品从理论到执行一网打尽主流编码器。

9.1           框架的契约-接口… 2

假诺把任何流媒体比喻成一个物流连串,那么编解码就是其中配货和装货的经过,那几个历程非凡主要,它的进度和收缩比对物流系统的意义万分大,影响物流连串的完好进程和本金。同样,对流媒体传输来说,编码也足够首要,它的编码质量、编码速度和编码压缩比会直接影响总体流媒体传输的用户体验和传导开销。

9.2           插件的雏形-抽象类… 3

本连串小说大纲之类,想复习此前小说的第一手点击直达链接:

9.3           完结接口… 4

(一)采集

9.4           反射机制… 5

(二)处理

9.5           反射工具类… 8

(三)编码和包裹

9.6           小结… 9

(四)推流和传导

 

(五)现代播放器原理

第天问     插件引擎计划

在介绍《第10章
宿主程序详细布署》往日对接口和插件的相关内容开展一下整机介绍,在筹划宿主程序的时候会用到那个文化,也是宿主程序与插件之间相互的焦点内容。

(六)延迟优化

9.1    框架的契约-接口

    
插件式框架的宿主程序启动后,它首先会加载相应的布置文件(例如:设备驱动配置文件等),找到相应的插件程序集,这个程序集以DLL文件格式存在,框架的宿主程序会找到指定的插件类型,由插件引擎按照插件类型(例如:IRunDevice)生成对象实例,由框架的宿主程序的管理器对插件实例进行管理和调度。

   
一个插件程序集可能蕴涵多个插件类型,那么框架宿主程序是何许分辨那个品种是或不是为要加载的插件呢?每个插件对象都有一个身份标识-接口,这么些标识在框架设计中被誉为“通信契约”。接口可以被当作是一种概念了必备的点子、属性和事件的会聚,因而宿主程序就足以因此那种契约来生成现实的实例对象,并对其他零件或接口公开可操作的对象。

   
插件式框架当作一个高聚合低耦合的平台,它的效应定义与功力完成之间是分其余。只要符合插件规范的二次开发组件都足以挂载到框架平埃德蒙顿,而它并不并心那一个零件的求实职能。当然,框架平台提供了一部分必需的信息、机制来保管这个零部件能够正常达成二次开发的功效。

   
在享有七个逻辑层次的结构设计中,各层之间的通讯大多通过接口来贯彻,接口不会随随便便改变,借使一个层的效能爆发变化,不会影响别的层;只要健康落成了接口的零部件功效,那么程序的运转就从不难题。那种做法使得各层之间的相互影响下降到最低,总而言之,接口在多工作层级中可以更好的解耦。

    在多数成效性的编程和规划工作中,很少要求考虑“接口(interface)
”的场地,若是我们只是满足通过控件的办法在IDE上编程和使用.NET
Framework中貌似的类库,可能永远不会在先后中采纳到接口,就算在C#等面向对象语言的语法书中读者会过数次看到过这么些词,也只是完毕平时的效果,并未了然面向对象编程的核情绪想。

    
接口是相似表现的概念和契约。如猫和狗等动物,只需求将一般性的、公共性的性质、动作等概念在接口里,例如:有眼睛、可以吃东西等。固然不一样动物之间存在很大距离,不过接口并不考虑它们分其他特性或效益的歧异,例如:什么颜色的双眼、吃哪些东西等。它只关切那几个品种都必须完成接口定义的具有机能,而达成了那个接口就足以被看做是一种动物。

    由此,接口的八个基本点的效应是:

n  定义多少个项目都急需的公家措施、属性。

n  作为一种不可实例化的门类存在。

三番五次接口已毕定义的办法、属性等,实际上是贯彻了一种政策。

(七)SDK 品质测试模型

9.2    插件的雏形-抽象类

接口与抽象类非凡相似,例如两者都无法new一个实例对象,却都可以作

为一种契约和概念被使用。不过接口和抽象类有本质的不等,这么些不一样包涵:

n  接口没有别的达成部分,不过抽象类可以两次三番接口后有的贯彻代码。

n  接口没有字段,不过抽象类可以分包字段。

n  接口可以被协会(Struct)继承,不过抽象类不行。

n  抽象类有构造函数和析构函数。

n  接口仅能一连自接口,而抽象类可以一连自其他类和接口。

n  接口帮忙多一连,抽象类仅辅助单根继承。

在MSDN的有关内容中,给出了之类关于接口与抽象类的指出:


如果预测要开创组件的多少个版本,则创立抽象类。抽象类提供不难易行的法门来控制组件版本。通过立异基类,所有继承类都随更改自动更新。另一方面,接口一旦缔培育无法改变,假如要翻新接口的版本,必须创立一个全新的接口。


借使创制的机能将在大范围的全异对象间使用,则动用接口。抽象类应保养用以关系密切的对象,而接口最符合为不相干的类提供通用的成效。


如果要统筹小而简易的功用模块,应该接纳接口。若是要设计大的功力单元,则应该使用抽象类。


如果要在组件的具有落成间提供通用的已兑现效益,应该使用抽象类。抽象类允许有的已毕类,而接口不带有其余成员的贯彻。

视频编码的含义

  • 原本视频数据存储空间大,一个 1080P 的 7 s 视频要求 817 MB
  • 土生土长视频数据传输占用带宽大,10 Mbps 的带宽传输上述 7 s 摄像必要 11
    分钟

而由此 H.264 编码压缩之后,摄像大小只有 708 k ,10 Mbps 的带宽仅仅须求500 ms
,可以满意实时传输的必要,所以从摄像采访传感器收集来的原始视频势需要通过视频编码。

9.3    完结接口

接口和抽象类都得以看作“通信契约”,为子类提供规范。下边定义一个接口和抽象类。

//定义一个接口
public interface IMyInterface
{
       void Action(int type);
       string Method(int para);
}

//定义一个抽象类
public abstract class BaseAbstract:IMyInterface

{
       public abstract void Action(int type); //继承此类抽象类时必须实现这个方法。

       public string Method(int para)         //实现这个方法
       {
              return para.ToString();
       }
}

接轨接口的话,需求已毕成套定义的方法或品质,如下代码:

public class MyClass1:IMyInterface
{
       public void Action(int type)
       {
              Console.WriteLine(type.ToString());
       }

       public string Method(int para)        
       {
              return para.ToString();
       }
}

继承抽象类的话,只必要完结抽象类没有完结的主意或质量,一般为架空方法或品质,如下代码:

public class MyClass2:BaseAbstract
{
       public void Action(int type)   //继承抽象类,只需要实现这个函数。
       {
              Console.WriteLine(type.ToString());
       }
}

基本原理

那干什么巨大的原始摄像可以编码成很小的视频呢?这中间的技艺是何许啊?
核感情想就是删除冗余新闻:

  • 空间冗余:图像相邻像素之间有较强的相关性
  • 时刻冗余:摄像体系的隔壁图像之间内容类同
  • 编码冗余:分裂像素值出现的几率分裂
  • 视觉冗余:人的视觉系统对某些细节不灵动
  • 知识冗余:规律性的构造可由先验知识和背景知识得到

视频本质上讲是一文山会海图片连续飞速的播音,最简便的回落情势就是对每一帧图片举办压缩,例如比较古老的
MJPEG
编码就是那种编码方式,那种编码格局唯有帧内编码,利用空间上的抽样预测来编码。形象的比喻就是把每帧都用作一张图纸,拔取JPEG
的编码格式对图片举办削减,那种编码只考虑了一张图纸内的冗余新闻压缩,如图
1,紫色的部分就是眼前待编码的区域,紫色就是未曾编码的区域,蓝色区域可以依据已经编码的局地开展预测(蓝色的右侧,上面,左下等)。

图1

唯独帧和帧之间因为时间的相关性,后续开发出了部分相比高档的编码器可以行使帧间编码,不难题说就是透过搜索算法选定了帧上的某些区域,然后经过测算当前帧和内外参考帧的向量差举办编码的一种样式,通过下边多少个图
2
延续帧大家得以看来,滑雪的同校是无止境位移的,但实在是雪景在向后位移,P
帧通过参考帧(I 或任何 P
帧)就可以举办编码了,编码之后的大小卓殊小,压缩比非凡高。

图 2

莫不有同学对那两张图纸怎么来的感兴趣,那里用了 FFmpeg
的两行命令来完成,具体 FFmpeg 的越来越多内容请看后续章节:

  • 先是行生成带有移动矢量的摄像
  • 其次行把每一帧都输出成图片

ffmpeg  -flags2 +export_mvs -i tutu.mp4 -vf codecview=mv=pf+bf+bb tutudebug2.mp4

ffmpeg -i tutudebug2.mp4 'tutunormal-%03d.bmp'

除去空间冗余和时间冗余的收缩,主要还有编码压缩和视觉收缩,下边是一个编码重视要的流程图:

图 3

图 4

图 3、图 4 七个流程,图 3 是帧内编码,图 4
是帧间编码,从图上见到的要紧差别就是第一步不等同,其实那多少个流程也是构成在同步的,我们日常说的
I 帧和 P 帧就是各自接纳了帧内编码和帧间编码。

9.4    反射机制

   
有了设备驱动或插件,还无法挂载到框架平台的宿主程序中。大家着想的题材是:已经有了随机几个档次插件程序集,框架平台如何从程序集中根据类型定义在内存中生成插件对象?

  
回看普通景况下程序引用其他程序集组件的长河。首先,要求运用“添加引用”对话框加载程序集。然后,通过using关键字引用命名空间。最终,在指令空间下找到呼应的类,并new出来一个实例。那是一种静态加载程序集的措施。

  
在插件式应用框架中,那种办法并不适合。宿主程序在编译时并不知道它将要处理哪些程序集,更从未艺术静态的将插件类型通过using关键字引入,那么些都是在运作时才能获取的新闻。在那样的情况下,也无法运用静态方法和new关键字来生成一个档次实例。而是要求在运作时取得相关音讯动态加载程序集,这些进度被称之为反射。

  
反射是动态发现类型音讯的一种力量,它就好像中期绑定,扶助开发人士在程序运行时使用程序集音信动态使用项目,那一个新闻在编译时是雾里看花的,反射还帮忙更高级的行为,如能在运行时动态创造新类型,并调用那一个项目标格局等。

   
JIT编译器在将IL代码编译开销地代码时,会查看IL代码中援引了那么些类型。在运行时,JIT编译器利用程序集的TypeRef和AssemblyRef元数据表的笔录项来确定哪一个顺序集定义了引用的种类。在
AssemblyRef元数据记录项中记录了先后集强名称的逐条部分—包罗名称,版本,公钥标记和语言文化。那些部分组成了一个字符串标识。JIT编译
器尝试将与这么些标识匹配的先后集加载到当下的AppDomain中。假诺程序集是弱命名的,标识大校只包罗名称。

   .NET
Framework中,为了落成动态加载,需求熟识Assembly、Type和Activator等工具类的形式。框架平台主要利用了Assembly工具类,这些类中包罗Load、LoadFrom和LoadFile。

1.      Assembly的Load方法

  
在内部CLR使用Assembly的Load方法来加载这几个程序集,那个措施与Win32的LoadLibray等价。在中间,Load导致CLR对程序集应用一个本子重定向策略。并在GAC中检索程序集,即便没有找到,就去应用程序的基目录,私有路径目录和codebase指定的地方查找。假设是一个弱命名程序集,Load不会向程序集应用重定向策略,也不会去GAC中摸索程序集。假如找到将重返一个Assembly的引用,即使没有找到则抛出FileNotFoundException相当。注意:Load方法假如已经加载一个同一标识的程序集只会简单的归来那一个顺序集的引用,而不会去创立一个新的先后集。

绝大多数动态可扩张应用程序中,Assembly的Load方法是程序集加载到AppDomain的首选办法。那种方法亟待指定程序集的标识字符串。对于弱命名程序集只用指定一个名字。

2.Assembly的LoadFrom方法

   
当大家通晓程序集的途径的场地,可以使用LoadFrom方法,它同意传入一个Path字符串,在其中,LoadFrom首先调用AssemblyName的静态方法GetAssemblyName。这一个点子打开指定的公文,通过AssemblyRef元数据表提取程序集的标识,然后倒闭文件。随后,LoadFrom在里边调用Assembly的Load方法寻找程序集。到此地,他的表现和Load方法是一样的。唯一差别的是,如若按Load的法子没有找到程序集,LoadFrom会加载Path路径指定的主次集。别的,Path能够是URL。

3.Assembly的LoadFile方法

   
这么些点子初一看和LoadFrom方法很像。但LoadFile方法不会在里面调用Assembly的Load方法。它只会加载指定Path的程序集,并且这几个艺术可以从随机路径加载程序集,同一程序集如果在不相同的不二法门下,它同意被反复加载,等于多少个同名的程序集加载到了AppDomain中,那或多或少和方面的两个主意完全不同。可是,LoadFile并不会加载程序集的器重项,也就是不会加载程序集引用的其余程序集,那会导致运行时找不到其它参照DLL的丰硕。要化解这一个难题,需要向AppDomain的AssemblyResolve事件登记,在回调方法中彰显加载引用的顺序集。类似于如此:

AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
       if (args.Name != null)
       {
              return Assembly.LoadFrom(string.Format("{0}\\plugin\\{1}.dll", Application.StartupPath, new AssemblyName(args.Name).Name));
       }
       return null;
}

     
越发注意:要测试LoadFile有没有加载引用的DLL,切不可将DLL拷贝到应用程序的根目录下测试,因为该目录是CLR加载程序集的默许目录,在这么些目录中即使存在引用的DLL,它会被加载,造成LoadFile会加载引用DLL的假象。可以在根目录下新建一个子目录如plugin,把引用的dll拷贝到这么些中举行测试。

    
反射机制也有它的毛病:安全性和性质方面。可是,框架平台在开行的时候、以及扩展新设备驱动(插件)的时候要求利用反射,一旦加载到宿主程序中,与静态引用程序集并未本质差异,都是寄存在内存中。

编码器的选料

前面梳理了弹指间编码器的规律和骨干流程,编码器经历了数十年的发展,已经从起先的只协理帧内编码演进到现近期的
H.265 和 VP9
为表示的新一代编码器,就方今部分大面积的编码器举办辨析,带我们啄磨一下编码器的世界。

9.5    反射工具类

插件式框架平台运用反射挂载设备驱动,在宿主程序中运行,须要一个专用的工具类来完结有关职能。代码定义如下:

/// <summary>
/// 一个轻便的 IObjectBuilder 实现
/// </summary>
public class TypeCreator : IObjectBuilder
{
       public T BuildUp<T>() where T : new()
       {
              return Activator.CreateInstance<T>();
       }

       public T BuildUp<T>(string typeName)
       {
              return (T)Activator.CreateInstance(Type.GetType(typeName));
       }

       public T BuildUp<T>(object[] args)
       {
              object result = Activator.CreateInstance(typeof(T),args);
              return (T)result;
       }

       /// <summary>
       /// 框架平台主要使用了这个函数。
       /// </summary>
       /// <typeparam name="T"></typeparam>
       /// <param name="assemblyname"></param>
       /// <param name="instancename"></param>
       /// <returns></returns>
       public T BuildUp<T>(string assemblyname, string instancename)
       {
              if (!System.IO.File.Exists(assemblyname))
              {
                     throw new FileNotFoundException(assemblyname + " 不存在");
              }
              System.Reflection.Assembly assmble = System.Reflection.Assembly.LoadFrom (assemblyname);
              object tmpobj = assmble.CreateInstance(instancename);
              return (T)tmpobj;
       }

       public T BuildUp<T>(string typeName, object[] args)
       {
              object result = Activator.CreateInstance(Type.GetType(typeName), args);
              return (T)result;
       }
}

H.264

9.6    小结

   
下一章节介绍宿主程序详细布署,必要对反射机制有肯定的打听,并且会动用到地方的工具类,并在此基础上拓展增加。

    框架平台就要全盘了,只必要一小步了。

 

小编:唯笑志在

Email:504547114@qq.com

QQ:504547114

.NET开发技术联盟:54256083

文档下载:http://pan.baidu.com/s/1pJ7lZWf

官方网址:http://www.bmpj.net

简介

H.264/AVC
项目意向创立一种摄像正式。与旧专业比较,它可以在更低带宽下提供优质摄像(换言之,唯有MPEG-2,H.263 或 MPEG-4 第 2
部分的一半带宽或更少),也不伸张太多设计复杂度使得没办法落到实处或促成基金过高。另一目的是提供充分的一帆风顺以在种种应用、互联网及系统中动用,包罗高、低带宽,高、低视频分辨率,广播,mp3存储,RTP/IP 互联网,以及 ITU-T 多媒体公用电话系统。

H.264/AVC
包括了一层层新的特征,使得它比起以前的编解码器不但可以更管用的举行编码,仍是可以在各类互联网环境下的利用中利用。那样的技艺基础让
H.264 成为包罗 YouTube
在内的在线摄像公司利用它看做重点的编解码器,不过使用它并不是一件很自在的业务,理论上讲使用
H.264 要求缴纳不菲的专利费用。

专利许可

和 MPEG-2 第一局地、第二片段,MPEG-4第二片段同样,使用 H.264/AVC
的出品创设商和服务提供商需要向他们的制品所选取的专利的所有者支付专利许可开销。那么些专利许可的主要来源是一家名为
MPEG-LA LLC 的民用社团,该集体和 MPEG
标准化协会没有此外关联,可是该团伙也管理著 MPEG-2
第一部分系统、第二有些视频、MPEG-4
第二有的视频和其余一些技巧的专利许可。

其余的专利许可则须求向另一家名为 VIA Licensing
的私有社团申请,这家公司其余也管理偏向音频压缩的正统如 MPEG-2 AAC 及
MPEG-4 奥迪(Audi)o 的专利许可。

H.264 的开源完成

  • openh264
  • x264

openh264
是Cisco完结的开源 H.264 编码,即使 H.264
需求缴纳不菲的专利花费,可是专利费有一个寒暑上限,Cisco把 OpenH264
落成的年份专利费交满后,OpenH264 事实上就足以防费自由的使用了。

x264
x264是一个利用GPL授权的摄像编码自由软件。x264 的根本作用在于进行H.264/MPEG-4 AVC 的视频编码,而不是用作解码器(decoder)之用。

除却开销难题比较来看:

  • openh264 CPU 的占据相对 x264低很多
  • openh264 只帮忙 baseline profile,x264 协助更多 profile

HEVC/H.265

简介

高功用视频编码(High Efficiency Video
Coding,简称HEVC)是一种视频压缩标准,被视为是 ITU-T H.264/MPEG-4 AVC
标准的继任者。2004 年始发由 ISO/IEC Moving Picture Experts
Group(MPEG)和 ITU-T Video Coding Experts Group(VCEG)作为 ISO/IEC
23008-2 MPEG-H Part 2 或称作 ITU-T H.265 开首制定。第一版的 HEVC/H.265
摄像压缩正式在 2013 年 4 月 13
日被接受为国际电信联盟(ITU-T)的正统标准。HEVC
被认为不但升高摄像质量,同时也能达标 H.264/MPEG-4 AVC
两倍之压缩率(等同于同样画面品质下比特率减少了 50%),可支撑 4K
分辨率甚至到超高清电视机(UHD电视),最高分辨率可高达
8192×4320(8K分辨率)。

H.265 的开源达成

  • libde265
  • x265

libde265
HEVC 由 struktur 公司以开源许可证 GNU LesserGeneral Public License
(LGPL)
提供,观众得以较慢的网速下欣赏到最高质量的形象。跟原先基于H.264标准的解码器相比较,libde265
HEVC 解码器可以将您的全高清内容带给多达两倍的受众,或者,收缩 50%
流媒体播放所要求的带宽。高清或者 4K/8K
超高清流媒体播放,低顺延/低带宽摄像会议,以及完整的运动装备覆盖。具有「拥塞感知」视频编码的稳定性,卓殊合乎采纳在
3/4G 和 LTE 互连网。

专利许可

HEVC Advance 必要拥有包罗苹果、YouTube、Netflix、非死不可、亚马逊(亚马逊)等应用
H.265 技术的始末创制商上缴内容收入的
0.5%当做技术使用费,而所有流媒体市场每年高达约 1000
亿美元的规模,且不断进步中,征收
0.5%万万是一笔巨大的开销。而且他们还尚无放过设备创建商,其中电视厂商需求开发每台
1.5 新币、移动设备厂商每台 0.8
日币的专利费。他们依然未曾放过蓝光设备播放器、游戏机、摄像机那样的厂商,那几个厂商必须开支每台
1.1 英镑的费用。最不可以令人承受的是,HEVC Advance
的专利使用权追溯到了厂商的「」”,意思是前边曾经出卖的产品仍旧要追缴花费。

x265 是由
MulticoreWare 开发,并开源。采纳 GPL
协议,可是帮衬这些类型的多少个店家结合了联盟可以在非 GPL
协议下行使那一个软件。

VP8

简介

VP8 是一个怒放的视频压缩格式,最早由 On2 Technologies 支出,随后由
谷歌 发布。同时 谷歌(Google) 也昭示了 VP8 编码的实做库:libvpx,以 BSD
授权条款的主意发行,随后也增大了专利使用权。而在经过一些冲突过后,最终VP8 的授权确认为一个绽放源代码授权。

此时此刻支撑 VP8 的网页浏览器有 Opera、Firefox 和 Chrome。

专利许可

2013 年八月,谷歌 与 MPEG LA 及 11 个专利持有者完毕协议,让谷歌 获取
VP8 以及其从前的 VPx 等编码所可能侵袭的专利授权,同时 谷歌(Google)也足以无偿再一次授权相关专利给 VP8 的用户,此协议同时适用于下一代 VPx
编码。至此 MPEG LA 舍弃创制 VP8 专利集中授权联盟,VP8
的用户将可确定职分使用此编码而无须担心可能的专利侵权授权金的难题。

VP8 的开源完结

  • libvpx

libvpx
是 VP8 的唯一开源完成,由 On2 Technologies 开发,Google收购后将其开放源码,License 相当宽松可以自由使用。

VP9

简介

VP9 的支出从 2011 年第三季起始,目标是在同画质下,比 VP8 编码收缩50%的文件大小,另一个目标则是要在编码作用上超越 HEVC 编码。

2012 年 12 月 13 日,Chromium 浏览器插足了 VP9 编码的协理。Chrome
浏览器则是在 2013 年 2 月 21 日始发扶助 VP9 编码的摄像播放。

谷歌 公布会在 2013 年 6 月 17 日完毕 VP9 编码的创建工作,届时Chrome
浏览器将会把 VP9 编码默许指导。2014 年 3 月 18 日,Mozilla 在 Firefox
浏览器中参预了 VP9 的支撑。

2015 年 4 月 3 日,谷歌公布了 libvpx1.4.0 增添了对 10 位和 12
位的比特深度支持、4:2:2 和 4:4:4 色度抽样,并 VP9 三主题编/解码。

专利许可

VP9 是一个绽放格式、无权利金的摄像编码格式。

VP9 的开源完结

  • libvpx

libvpx
是 VP9 的绝无仅有开源达成,由 谷歌(Google) 开发珍贵,里面有一些代码是 VP8 和 VP9
公用的,其他分别是 VP8 和 VP9 的编解码完毕。

VP9 和 H.264 和 HEVC 比较

Codec HEVC x264 vp9
HEVC -42.2% 32.6%
x264 75.8% 18.5%
vp9 48.3% -14.6%
Codec HEVC vs. VP9(in %) VP9 vs. x264 (in %)
Total Average 612 39399

引用 Comparative Assessment of H.265/MPEG-HEVC, VP9, and
H.264/MPEG-AVC Encoders for Low-Delay Video Applications
那篇相比较新的诗歌对,低延迟视频进行编码的测试结果。

HEVC 和 H.264 在不相同分辨率下的相比

跟 H.264/MPEG-4 相比,HEVC 的平均比特率减低值为:

分辨率 480P 720P 1080P 4K UHD
HEVC 52% 56% 62% 64%

可知码率下落了 60% 以上。

  • HEVC (H.265) 对 VP9 和 H.264 在码率节省上有较大的优势,在同样 PSNR
    下独家节省了 48.3% 和 75.8%。
  • H.264 在编码时间上有巨大优势,比较 VP9 和 HEVC(H.265) ,HEVC 是 VP9
    的6倍,VP9 是 H.264 的将近 40 倍

FFmpeg

谈到录像编码相关内容就不得不提一个宏大的软件包 — FFmpeg。

FFmpeg
是一个自由软件,可以运作音频和视频三种格式的录影、转换、流作用,包括了
libavcodec ——那是一个用以三个品种中音频和摄像的解码器库,以及
libavformat ——一个旋律与视频格式转换库。

FFmpeg 那些单词中的 FF 指的是 法斯特 Forward。有些新手写信给 FFmpeg
的类型总裁,询问 FF 是还是不是代表 法斯特 Free 或者 法斯特 Fourier
等情趣,FFmpeg 的项目官员回信说:「Just for the record, the original
meaning of FF in FFmpeg is 法斯特 Forward…」

那些类型初期是由 Fabrice Bellard 发起的,而近来是由 迈克尔 Niedermayer
在进展珍视。许多FFmpeg的开发者同时也是 MPlayer 项目标积极分子,FFmpeg 在
MPlayer 项目中是被设计为服务器版本举办付出。

FFmpeg 下载地址是 : FFmpeg
Download

  • 可以浏览器输入下载,近年来支撑 Linux ,Mac OS,Windows
    多个主流的阳台,也可以团结编译到 Android 或者 iOS 平台。
  • 若果是 Mac OS ,可以经过 brew 安装
    brew install ffmpeg --with-libvpx --with-libvorbis --with-ffplay

我们可以用 FFmpeg
来做什么有用有风趣的事务啊?通过一多级小试验来带大家清楚 FFmpeg
的神奇和有力。

FFmpeg 录屏

透过一个小例子看一下怎么在 Mac OS 上边接纳 FFmpeg 举行录屏:

输入:

ffmpeg -f avfoundation -list_devices true -i ""

输出:

[AVFoundation input device @ 0x7fbec0c10940] AVFoundation video devices:
[AVFoundation input device @ 0x7fbec0c10940] [0] FaceTime HD Camera
[AVFoundation input device @ 0x7fbec0c10940] [1] Capture screen 0
[AVFoundation input device @ 0x7fbec0c10940] [2] Capture screen 1
[AVFoundation input device @ 0x7fbec0c10940] AVFoundation audio devices:
[AVFoundation input device @ 0x7fbec0c10940] [0] Built-in Microphone

付给了现阶段设备扶助的拥有输入设备的列表和数码,我本地有两块显示屏,所以 1
和 2 都是我显示屏,可以挑选一块进行录屏。

翻开当前的 H.264 编解码器:

输入:

ffmpeg -codecs | grep 264

输出:

 DEV.LS h264                 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 (decoders: h264 h264_vda ) (encoders: libx264 libx264rgb )

查阅当前的 VP8 编解码器:

输入:

ffmpeg -codecs | grep vp8

输出:

  DEV.L. vp8                  On2 VP8 (decoders: vp8 libvpx ) (encoders: libvpx )

可以选用用 vp8 或者 h264 做编码器

ffmpeg -r 30 -f avfoundation -i 1 -vcodec vp8 -quality realtime screen2.webm
# -quality realtime 用来优化编码器,如果不加在我的 Air 上帧率只能达到 2

or

ffmpeg -r 30 -f avfoundation -i 1 -vcodec h264 screen.mp4

下一场用 ffplay 播放就足以了

ffplay screen.mp4

or

ffplay screen2.webp

FFmpeg 摄像转换成 gif

有一个专程有效的急需,在网上发现了一个特地风趣的视频想把它转换成一个动态表情,作为一个
IT
从业者,我第四个想到的不是下载一个转码器,也不是去找一个在线转换网站,直接利用手边的工具
FFmpeg,瞬间就形成了转码:

ffmpeg -ss 10 -t 10  -i tutu.mp4  -s 80x60  tutu.gif
## -ss 指从 10s 开始转码,-t 指转换 10s 的视频 -s

FFmpeg 录制显示屏并直播

可以继承扩充例子1,直播当前屏幕的内容,向我们介绍一下怎么通过几行命令搭建一个测试用的直播服务:

Step 1:首先安装 docker:
访问 Docker
Download

,按操作系统下载安装。

Step 2:下载 nginx-rtmp 镜像:

docker pull chakkritte/docker-nginx-rtmp

Step 3:创建 nginx html 路径,启动 docker-nginx-rtmp

mkdir ~/rtmp

docker run -d -p 80:80 -p 1935:1935 -v ~/rtmp:/usr/local/nginx/html chakkritte/docker-nginx-rtmp

Step 4:推送显示器录制到 nignx-rtmp

ffmpeg -y -loglevel warning -f avfoundation -i 2 -r 30 -s 480x320 -threads 2 -vcodec libx264  -f flv rtmp://127.0.0.1/live/test

Step 5:用 ffplay 播放

ffplay rtmp://127.0.0.1/live/test

小结一下,FFmpeg
是个地道的工具,可以由此它做到很多平凡的工作和试验,可是距离提供真正可用的流媒体服务、直播服务还有万分多的行事要做,那地点可以参见七牛云发布的
七牛直播云服务

封装

介绍完了摄像编码后,再来介绍部分卷入。沿用前边的比喻,封装能够知道为使用哪个种类货车去运输,也就是传媒的容器。

所谓容器,就是把编码器生成的多媒体内容(视频,音频,字幕,章节音讯等)混合封装在同步的正经。容器使得不一致多媒体内容同步播放变得很简短,而容器的另一个功力就是为多媒体内容提供索引,也就是说假如没有容器存在的话一部影视你不得不从一开首观看最终,不可以拖动进程条(当然这种状态下一些播放器会话相比长的时间暂时创办索引),而且要是您不友善去手动其余载入音频就从未有过声息,上边介绍三种常见的封装格式和优缺点:

  1. AVI 格式(后缀为 .AVI): 它的英文全称为 奥迪o Video Interleaved
    ,即音频视频交错格式。它于 1992 年被 Microsoft 集团推出。
    那种摄像格式的优点是图像质量好。由于无损AVI可以保存 alpha
    通道,平常被大家拔取。缺点太多,体积过于庞大,而且进一步不好的是减掉正式不统一,最广泛的气象就是高版本
    Windows 媒体播放器播放不了采用早期编码编辑的AVI格式摄像,而低版本
    Windows
    媒体播放器又播放不了选用最新编码编辑的AVI格式视频,所以大家在拓展部分AVI格式的视频播放时常会并发是因为视频编码难点而致使的摄像不能播放或即使可以播放,但存在不可以调节播放进度和广播时惟有响动没有图像等部分无缘无故的难题。

  2. DV-AVI 格式(后缀为 .AVI): DV的英文全称是 Digital Video Format
    ,是由Sony、Panasonic、爱谱王 等多家厂商共同提议的一种家用数字视频格式。
    数字视频机就是应用那种格式记录摄像数据的。它可以经过电脑的 IEEE 1394
    端口传输视频数据到总结机,也得以将电脑中编辑好的的视频数据回录到多少视频机中。那种录像格式的文件增加名也是
    avi。电视机台利用视频带记录模拟信号,通过 EDIUS 由IEEE
    1394端口采集卡从视频带中采集出来的摄像就是这种格式。

  3. Quick提姆e File Format 格式(后缀为 .MOV):
    美利坚合众国Apple集团支付的一种摄像格式,默许的播放器是苹果的Quick提姆e。
    负有较高的压缩比率和较完善的摄像清晰度等特色,并得以保存alpha通道。

  4. MPEG 格式(文件后缀可以是 .MPG .MPEG .MPE .DAT .VOB .ASF .3GP
    .mp3等) : 它的英文全称为 Moving Picture Experts
    Group,即活动图像专家组格式,该专家组建于1988年,专门负责为 CD
    建立视频和旋律标准,而成员都是为视频、音频及系统领域的技术专家。
    MPEG 文件格式是活动图像压缩算法的国际标准。MPEG
    格式近来有多少个收缩正式,分别是 MPEG-1、MPEG-2、和MPEG-4
    。MPEG-1、MPEG-2 如今曾经采纳较少,器重介绍
    MPEG-4,其制订于1998年,MPEG-4
    是为着播放流式媒体的高质量视频而越发规划的,以求使用最少的数码得到最佳的图像品质。近日MPEG-4 最有吸引力的地点在于它亦可保留接近于mp4画质的小体积视频文件。

  5. WMV 格式(后缀为.WMV .ASF): 它的英文全称为Windows Media
    Video,也是微软推出的一种接纳独立编码格局并且能够一向在网上实时看到视频节目标文本压缩格式。
    WMV格式的重大优点包含:本地或网络回看,丰硕的流间关系以及增添性等。WMV
    格式要求在网站上播放,须要安装 Windows Media Player( 简称 WMP
    ),很不便宜,现在曾经大概从未网站使用了。

  6. Real Video 格式(后缀为 .RM .RMVB): Real Networks
    公司所制定的音频摄像压缩正式称为Real Media。
    用户能够利用 RealPlayer
    根据不相同的网络传输速率制定出分裂的压缩比率,从而完成在低速率的互连网上进展形象数据实时传送和广播。RMVB
    格式:那是一种由RM视频格式升级延伸出的新摄像格式,当然品质上有很大的升官。RMVB
    视频也是持有较强烈的优势,一部大小为700MB左右的 mp4影片,假若将其转录成同样品质的 RMVB 格式,其个头最多也就 400MB
    左右。大家可能注意到了,在此从前在互联网上下载电影和视频的时候,平日接触到
    RMVB
    格式,可是随着时代的进化那种格式被更多的更赏心悦目的格式替代,闻明的人们影视字幕组在二〇一三年曾经揭橥不再限于
    RMVB 格式视频。

  7. Flash Video 格式(后缀为 .FLV):由 Adobe Flash
    延伸出来的的一种流行网络视频封装格式。随着摄像网站的增进,那几个格式已经卓殊普及。

  8. Matroska 格式(后缀为
    .MKV):是一种新的多媒体封装格式,那一个封装格式可把多样分歧编码的视频及16条或上述分歧格式的韵律和言语差其余字幕封装到一个
    Matroska Media
    档内。它也是中间一种开放源代码的多媒体封装格式。Matroska
    同时还是可以够提供越发好的并行成效,而且比 MPEG 的福利、强大。

  9. MPEG2-TS 格式 (后缀为 .ts)(Transport
    Stream“传输流”;又称MTS、TS)是一种传输和存储包蕴音效、视频与通讯协议各类数码的专业格式,用于数字电视机广播系统,如DVB、ATSC、IPTV等等。
    MPEG2-TS 定义于 MPEG-2
    第一有些,系统(即原来之ISO/IEC标准13818-1或ITU-T Rec. H.222.0)。
    Media Player Classic、VLC
    多媒体播放器等软件可以间接播放MPEG-TS文件。

脚下,大家在流媒体传输,尤其是直播中重大利用的就是 FLV 和 MPEG2-TS
格式,分别用于 RTMP/HTTP-FLV 和 HLS 协议。

下一期大家将系统讲授视频直播的推流和传导,尽请期待~

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图