英特尔提供了一套基于VA-API/Media SDK的硬件加速方案,通过在FFmpeg中集成Intel GPU的媒体硬件加速能力,为用户提供更多的收益。本文来自英特尔资深软件开发工程师赵军在LiveVideoStackCon 2017大会上的分享,并由LiveVideoStack整理而成。
文 / 赵军
整理 / LiveVideoStack
大家好,今天与大家分享的主题是FFmpeg在 Intel GPU上的硬件加速与优化。
1、Media pipeline review
上图展示的是典型的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%到50%,其背后是对计算量的大幅渴求,CPU的计算能力有时不能实时跟上计算量的需求或在高转码密度条件下不能提供较好的性价比,在此背景下,Intel提出了基于Intel GPU的媒体硬件加速解决方案。
2、何谓FFmpeg/VA-API?
作为最为流行的开源媒体解决方案,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。
3、Linux Video API