FFmpeg在Intel GPU上的硬件加速与优化

  • 时间:
  • 浏览:1

1)解码支持

9.2 FFmpeg中的硬件加速

4、VA-API

6.1 Intel GPU Media 硬件编程模型

有人歌词 歌词 在防止你四种 异构计算时,始终前要面对此问题:CPU与GPU、DSP之间的数据交换。数据从CPU拷贝到GPU与从GPU拷贝到CPU并也有另一一三个 对等关系,一般而言,数据从CPU到GPU进行拷贝的数率加快数率且不存在性能瓶颈;而原因是GPU到CPU的拷贝交换有原因面临性能瓶颈,其原因是两者使用了不同的缓存策略。原因有人歌词 通过mmap GPU的memory到CPU侧,以后不进行任何优化我希望直接使用诸如memcpy函数将数据拷贝到CPU侧,会发现性能原因不如预期。关于你四种 问题,英特尔也提供了你四种 优化措施,这类使用SSE4/AVX等指令集中提供的bypass Cache的特定指令,也我希望所谓的Faster Copy身前的特定指令;另外,也可考虑直接用GPU进行拷贝而非使用CPU,原因考虑从OpenCL层面进行优化。

5、VA-API可用的后端驱动

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/vn9PLgZvnPs1522s82g/article/details/835727400

6.4 使用案例

作为最为流行的开源媒体防止方案,FFmpeg有四种 使用措施:直接使用它自带Tools,原因把FFmpeg作为Library调用它的API而实现被委托人的逻辑。其中的Tools中带有人歌词 突然想看 的转码工具FFmpeg;轻量媒体播放器FFPlayer;进行格式的探测分析的FFProbe ;轻量级流媒体测试的服务器FFServer等。另外,FFmpeg的内部人员实现基本以C语言为主,辅助以要素汇编优化;同时它支持Linux、MacOSX、Android、Windows等不同OS,有着良好的跨平台兼容性。这里另外强调你四种 的是FFmpeg自身的License问题,也许国内的厂商不必不怎么能在意License,但在实际使用场景中,所使用软件原因库的License即版权是越来越不考虑的问题。最近几年FFmpeg原因将License的问题澄清得比较清楚,目前它的大多数内部人员实现代码使用GPL2.1版本的License。

上图展示的是Intel GPU Decode要素的的支持情況。一般情況下有人歌词 可上可不还可以将Decode分为8Bit与10Bit,以HEVC为例,有你四种 数据显示10bit的压缩率要高于8bit,感兴趣的同学可上可不还可以思考一下其原因。从表也可上可不还可以想看 ,英特尔的各代GPU逐渐进化,从以后以后以后现在开始只支持MPEG-2、H.264、VC-1解码的Sandy Bridge到增加了MJPEG解码支持的Ivy Bridge再到多用于嵌入式平台的Bay Trail乃至以后的Haswell,从Broadwell以后以后以后现在开始对VP8的支持与Cherry Trail/ Braswell对HEVC的支持再到Skylake以后的Apollo lake与 Kaby lake对VP9解码与10bit HEVC&VP9的解码支持,其解码能力稳步增加。

上图展示的是有人歌词 正在实践与探索的技术点,期待通过以上优化为音视频行业带来技术进步与行业发展。

3、Linux Video API

8、FFmpeg VA-API的细节信息

9.3 硬件或驱动不支持

2)编码支持

Intel GPU从Gen 3的Pinetrail发展到Gen 9.5的Kabylake,每一代GPU的功能也有增强,在Media上的能力也在增强。关于GPU性能有人歌词 比较关注以下三要素指标:第一要素是3D渲染能力,你四种 要素的标准化程度较好,可上可不还可以使用标准接口包括OpenGL或Vulkan,当然也有Windows上可与OpenGL与Vulkan适配的DirectX等;第二要素是Media;第三要素则为通用计算,其中包括NVIDIA的CUDA与AMD、ARM等公司采用的OpenLL。附带说一句,有人会混淆GPU的通用计算能力与Media防止能力,以为通用计算能力很强,则Media能力就很强,这并非 正确,实际使用中,前要把你四种 另一一三个 指标分开来根据具体的使用场景来分析与比较,以选泽最要花费的硬件方案。

10、To Do List 

9、你四种 问题

编码方面,Intel GPU很早以后以后以后现在开始就支持了H.264编码,到了Broadwell增加了对VP8的支持;而Skylake则增加HEVC和MJPEG,到了Kaby Lake时有人歌词 增加了对VP9和10Bit HEVC的编码支持。关于VP9我可上可不还可以强调你四种 ,据我所知,现在量产的SoC/GPU/CPU中原因越来越英特尔的Kaby Lake及其后续的产品与三星的SoC支持VP9的编码硬件加速。

分发 / LiveVideoStack

6.2 FFmpeg & Intel GPU加速方案

6.3 Intel GPU 支持

VA-API可用的后端驱动非常多:Intel VA(i965)Driver是Intel OTC Team开发的一套全开源驱动,以后也冒出了Intel Hybird Driver、Intel iHD Driver等;在后端实现中还有Mesa‘S state-trackers包括Radeon、Nouveau、Freedreno等的支持,另外,还你四种 公司开发了你四种 API Bridge,包括Vdpau-va Bridge、Powervr-va的bridge以提供VA-API的支持,但你四种 bridge大要素原因种种原因慢慢转为封闭而逐渐被废弃;与此同时,英特尔的态度则更为开放,它希望大要素的开发者有能力在现有性心智心智成长期图片 图片 平台上进行更厚度次的定制与探索,开放出更多的硬件能力以及驱动代码,这也是英特尔作为另一一三个 开源大厂的风范吧。

英特尔提供了一套基于VA-API/Media SDK的硬件加速方案,通过在FFmpeg中集成Intel GPU的媒体硬件加速能力,为用户提供更多的收益。本文来自英特尔资深软件开发工程师赵军在LiveVideoStackCon 2017大会上的分享,并由LiveVideoStack分发而成。

上图展示的你四种 Use Cases可基本带有大要素用户的使用场景。解码要素主我希望使用hwaccel vaapi进行硬件解码,原因一款设备上原因存在多款GPU,而且 有人歌词 需我希望hwaccel_device选泽不同的硬件设备。对比硬件编码与硬件解码有人歌词 越来越发现,在解码要素有人歌词 使用hwaccel_device而编码要素则使用vaapi_device。这里的vaapi_device是另一一三个 Group Option,原因FFmpeg中存在Group Option与Per-Stream Option,解码要素的hwaccel_device是Per-Stream Option,而编码要素的vaapi_device是全局的而且 Decoder和Encoder只需指定一次。从上方看来,转码的例子更为比较复杂,首先进行硬件解码,而后在GPU中进行de-interlace与Scall和HEVC编码,实际上整个过程是另一一三个 硬件解码结合GPU中的Deinterlace/Scale和以后的HEVC硬编的过程,这里前要注意你四种 关于码控设定的问题,对此问题有兴趣的同学可上可不还可以直接阅读FFmpeg的文档原因代码。

当时的英特尔以后以后以后现在开始涉足硬件加速领域,于是在1999年左右英特尔提出VA-API接口。这是一套在Linux上的标准接口,从上层来看有人歌词 可上可不还可以将其理解为另一一三个 OS层面的Video加速Spec,且与硬件无直接关联。这套通用接口,同时前要特定的后端实现支持。与大多数开源项目这类,VA-API并越来越另一一三个 不怎么能好的Document进行说明,前要被委托人仔细的去读它的头文件以了解其设计思想和细节。另外,既然这是另一一三个 Spec,其设计上自然想剥离与特定硬件的强关联,统统人太好今天我的分享主要围绕Intel GPU实践进行,但实际上VA-API这套Spec并非 只限于英特尔的GPU。

FFmpeg提供了你四种 Filter用于实现硬件加速pipeline的建立,分别为Hwupload、Hwdownload、Hwmap、Hwunmap,使得在组成硬件的Pipeline时尽量防止少量的数据交换,所有操作尽量在GPU内部人员直接完成以提升性能。

上图展示的是典型的Media Pipeline。有人歌词 知道,FFmpeg对输入格式支持非常的全面,可上可不还可以是文件、网络流等,也可上可不还可以使用Device的Caputer作为输入;输入的音视频经过Splitter后一般会分为四种 常见场景:Play Back与Transcoder。上图的右上半要素实际是另一一三个 Transcoder的基本流程,解复用以后的Video、Audio的ES流,再经过Video、Audio的Filter,大要素情況下,Video有原因在AVFilter执行你四种 Scale、Frc、Crop操作(也可上可不还可以在AVFiter中抓取有价值的信息);以后音视频数据会被转码成为用户指定的格式,转码以后多伴随着码率转换、指定IPB帧类型等;Audio也会经过这类的防止流程。上图的右下半部可上可不还可以视为播放器防止流程也我希望Playback,Playback流程与Transcoder防止流程的主要差异在于对解码的数据是是是不是进行再次编码原因直接显示。另外,众所周知,Encoder与Decoder的比较复杂程度存在另一一三个 数量级的差异,计算比较复杂度要花费为10:1,且一般情況下Encoder每十年进化为一代,从MPEG2发展到H264要花费用了十年时间,而从H264发展到HEVC将近十年时间(实际越来越十年),其计算比较复杂度提升均为上一代的十倍左右,但压缩率提升要花费越来越40%到400%,其身前是对计算量的大幅渴求,CPU的计算能力有时越来越实时跟上计算量的需求或在高转码密度条件下越来越提供较好的性价比,在此背景下,Intel提出了基于Intel GPU的媒体硬件加速防止方案。

2、何谓FFmpeg/VA-API?

从FFmpeg到具体的GPU,是怎么还可以进行你四种 Media防止的?首先FFmpeg会通过VA-API接口,调到对应的Driver这类i965或iHD,以后数据经过OS Scheduler进入OS KMD,接下来经过一系列硬件编程抽象和GPU&CPU数据交换,生成Command streamer并传输给EU(也我希望Intel GPU中的另一一三个 计算执行单元)原因特定的IP以执行相关的Media任务。注意,GPU的Media要素有时也会使用EU你四种 通用计算资源,而像Sampler、VDBOX、VEBOX、SFC等也有基于你四种 特定的Fix Function硬件实现相应功能。统统,可上可不还可以我希望理解,英特尔的GPU实际上是将媒体的大要素功能通过Fix Function措施实现,同时必要以后使用EU作为另一一三个 通用的计算资源我希望协同工作的。

6、Intel GPU

有人歌词 好,今天与有人歌词 分享的主题是FFmpeg在 Intel GPU上的硬件加速与优化。

1、Media pipeline review

上图展示的是FFmpeg硬件加速全览,我可上可不还可以你四种 要素对探索基于FFmpeg实现跨平台的开发者来说非常有帮助。开发者突然前要面对不同的硬件厂商:Intel、NVIDIA、AMD等等,有人歌词 希望仅仅与FFmpeg经过一次集成,就可在不同硬件上实现同样的功能。而现实情況,即是存在OS层面可上可不还可以进行硬件优化的API诸如Windows上的Dxva或MacOS上的VideotoolBox、Linux的Vaapi等,人太好现原因还是非常分散,而FFmpeg在支持各种硬件加速接口以后,则帮助防止了上方的你四种 问题。另外,对于上表,Decoder要素只列举了是是是不是支持硬件surface的输出。除此之外还有你四种 附加功能这类Filter,作为FFmpeg中非常重要的一要素,它主我希望为了进行Video 后防止等;上表中的Hardware Context是指基于FFmpeg内部人员的硬件加速接口的实现,Useable from FFmpeg CLI是指FFmpeg的命令行是是是不是直接可用硬件加速(它的典型使用场景是,在Server端将FFmpeg直接作为工具使用,通过PHP在后端直接调用FFmpeg的Tools)。另外,原因开发者前要调用FFmpeg API进行解码,此时前要关注Hwaccel的支持情況。最后我可上可不还可以强调一下图中Decoder要素里的Internal和Standalone。它实际上是另一一三个 历史遗产,在FFmpeg中,很早便实现了H.264的软解码,在此基础上,原因想使能GPU的解码能力则前要面临以下另一一三个 选泽:可上可不还可以选泽重新实现有别于软解码的另一套基于GPU解码实现,可上可不还可以考虑为前要完整实现另一一三个 这类h264_vaapi的解码其;也可将解码相关的你四种 硬件加速工作直接Hook在已有的软解码Codec中,当时的开发者选泽了后者,统统大要素基于OS的硬件加速解码方案都基于后者的方案也我希望Internal AVHWaccel;但诸如NVIDIA等提供NVDEC,NVENC的方案,原因自身原因是另一一三个 完整的硬件解码器,统统在FFmpeg内只需实现成另一一三个 简单的wrappe人即可,不前要借助FFmpe已有的软解码Codec的任何功能。

大要素客户偏向于使用FFmpeg的同时,也希望其具备出色的硬件加速能力,有人歌词 现在致力于在FFmpeg中集成Intel GPU诸多的媒体硬件加速能力,使用户可通过FFmpeg的接口使能调用英特尔的GPU的各种能力从而带来更多收益。这里的集成措施主要有四种 :1)直接实现为与FFmpeg融为一体的Native Decode/Encode。FFmpeg的大要素Decode如H.264、H.265、VP8、VP9等都使用Native Decoder的措施,2)Warpper第三方库的,如在FFmpeg中集成Libx264的措施;现在要素Encode都以第三方库的形式集成进FFmpeg的。根据上图有人歌词 可上可不还可以想看 在Intel GPU中集成了另一一三个 Plugin到FFmpeg中:第另一一三个 是QSV Plugin,其这类于libx265的做法,其Codec实现的底层与MediaSDK相关;但FFmpeg社区更倾向于基于libva/vaapi的措施,即直接在FFmpeg中进行集成,不warpper第三方的库,一是原因此方案相对而言更加轻量,二是原因此方案更加开放;我希望做原因将完整的硬件Codec要素的代码都集成在FFmpeg中,与FFmpeg融为一体,原因客户希望进行定制或改变,越来越直接在FFmpeg内部人员代码中修改即可实现。除了防止基本的解码/编码硬件加速问题,有人歌词 也在考虑集成OpenCL、OpenCV等以适应客户的你四种 你四种 需求。  

9.1 CPU与GPU的数据交换

接下来我将介绍Linux平台上Video加速API的进化历史。有人歌词 知道,每另一一三个 突破性创新也有从细微之处以后以后以后现在开始慢慢演化,最后才原因成为举世瞩目的创造;另外统统技术的进化过程中,也有工程与算法科学相互交织,Linux上的硬件加速API的进化流程也遵循了你四种 点。最初的Linux Video API被称为Xv,基本越来越借助硬件加速实现Scaling与Color Space Conversion另一一三个 功能,明显无法满足行业需求;以后经过扩展,使得在那个MPEG-2称霸的时代实现了对MPEG-2 Decoding硬件加速API的支持, 也我希望Xv/XvMC,不过你四种 要素在当时还等待歌曲在比较初级的阶段,iDCT、XvMC-VLD等还未实现被API所标准化;以后社区便以后以后以后现在开始尝试实现Slice层加速API标准化,以防止以后包括不支持解码所有阶段硬件加速且依赖于X-Protocol协议等在内的诸多问题,演化到现在,最终的结果我希望VA-API。

上图展示的是FFmpeg VAAPI的你四种 细节信息,以后我原因对HWAcceled的解码与Native的解码进行了说明。提及编码,硬件加速的编码带来的最大好处是数率优势:我我希望基于Skylake-U我希望双核四守护进程的低电压CPU上测试10400P的转码,基本可实现240FPS的实时转码;同时,在大规模部署时越来越不考虑功耗比与性价比,也我希望单路的编码或转码前要消耗十十几个 电能以及单路转码的成本。现在集成了GPU的英特尔PC防止器,其功耗在40~65w,原因是面向服务器工作站的Xeon E3系列,可在另一一三个 65w的防止器上实现14到18路的10400P转码,而能达到相同性能的NVIDIA GPU所需的能耗要花费在400w左右。另外,对于硬件编码,有你四种 客户原因在图像质量上有更高的需求,现在英特尔的GPU在低码率上防止效果还有提升空间,但在防止中高码率文件时,其评测结果与X264相比并无明显的差距。原因客户期望借助被委托人的你四种 高阶算法通过更厚度的定制实现更强大的功能,Intel也开放了被称为Flexible Encoder Interface (FEI)的底层接口。此接口可完整全面展示Intel GPU的完整硬件编码能力,并让用户拥有足够的灵活度去Tunning各种算法;原因说FFmpeg代表的是另一一三个 可上可不还可以直接调用的性心智心智成长期图片 图片 平台,越来越FEI则是可定制Codec算法的通用接口。与此同时,FEI对客户的能力要求也更高,原因有高阶厚度次定制化的编码需求,可上可不还可以考虑FEI。最后,附带一句,有人歌词 同样在AVFilter中集成了GPU的VPP以实现硬件加速的Scaling与Deinterlace等操作,后续也会支持Overlay、CSC等。

7、FFmpeg硬件加速全览

文 / 赵军

原因完成了编解码的部署,前要AVFilter相关的优化但硬件原因驱动层面却不支持,面对你四种 情況,有人歌词 可考虑OpenCL。原因OpenCL现在可与FFmpeg Video的编解码进行Buffer Sharing,这要花费是另一一三个 GPU内部人员零拷贝的过程;只前要依靠Hwmap和Hwunmap实现的map就能直接用OpenCL对现有的AVFilter进行优化,从而帮助开发者防止此类原因CPU/GPU的数据交换原因的性能问题,与此同时,把OpenCL作为对GPU通用计算的标准接口,来优化有人歌词 的各种视频或图像的防止;另外,有人歌词 可上可不还可以将此思路放得更宽你四种 ,原因客户不希望直接使用来OpenCL来手动优化AVFilter,也可考虑把OpenCV作为另一一三个 原因被OpenCL优化好的算法集合再集成进FFmpeg中。有人歌词 现在也在考虑此类措施并在其上进行尝试。