基于FFmpeg+VAAPI的硬件加速渲染技术

1.写在前面

 硬件加速即利用GPU来完成图形相关的操作,将CPU空闲出来处理其他事务,特别是在CPU性能不足的情况下,此类操作就更必要了。在视频处理上,DXVA是微软定制的视频加速规范,而在Linux 平台上则是由NVIDIA和Intel分别提供的VDPAU和VAAPI加速规范。灵跃桌面云利用上述API可以有效加速视频解码和图像处理,降低系统CPU占用,提升系统性能。

2.实现方案

 针对Intel CPU X86架构平台,可采用FFmpeg+VAAPI的硬解方案。其中,FFmpeg用于处理各种格式的视频解码;VAAPI则提供对硬件加速视频处理的访问,处理流程图如下。


image.jpg

2.1 相关环境部署

(一)安装依赖包
apt-get install autoconf automake debhelper ladspa-sdk libsoundio-dev libbluray-dev libbs2b-dev libcaca-dev libcdio-paranoia-dev libdvdnav-dev libdvdread-dev libegl1-mesa-dev libenca-dev libfontconfig1-dev libfreetype6-dev libfribidi-dev libgl1-mesa-dev libgbm-dev libgme-dev libgnutls28-dev libgsm1-dev libguess-dev libharfbuzz-dev libjack-jackd2-dev libjpeg-dev liblcms2-dev liblircclient-dev liblua5.3-dev libmodplug-dev libmp3lame-dev libnetcdf-dev libopenal-dev libopus-dev libopencore-amrnb-dev libopencore-amrwb-dev libpulse-dev librtmp-dev librubberband-dev libschroedinger-dev libsmbclient-dev libssh-dev libsoxr-dev libspeex-dev libtheora-dev libtool libtwolame-dev libuchardet-dev libv4l-dev libva-dev libvorbis-dev libvo-amrwbenc-dev libvpx-dev libwavpack-dev libx264-dev libx265-dev libx11-dev libxext-dev libxinerama-dev libxrandr-dev libxss-dev libxv-dev libxvidcore-dev pkg-config python python-docutils x11proto-core-dev yasm zlib1g-dev
(二)安装libva
 进入当前用户目录,并下载libva源码包:
cd ~
git clone https://github.com/01org/libva.git
 进入libva文件夹中,
cd libva
 切换到1.7.3版本:
git checkout libva-1.7.3
 执行编译安装:
./autogen.sh && ./configure && make && make install
 运行vainfo查看执行结果

image.jpg

图中红框内表示当前所支持硬解的视频压缩格式。
(三)安装FFmpeg
 进入灵跃桌面云当前用户目录,并下载FFmpeg源码包
cd ~
git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg
 进入FFmpeg文件夹中,
cd ffmpeg
 执行编译安装
./configure --disable-static --enable-shared --enable-gpl --enable-version3 --disable-debug --enable-vaapi &&make && make install
 最后执行ffmpeg查看执行结果。
image.jpg

2.2 代码实现
(一)视频播放原理
 简单来说,视频播放器在播放本地视频文件需要经历以下步骤:解封装,解码,音视频帧同步,最终会把数据投递到对应的驱动设备,具体过程如下图所示:


image.jpg

(二)VAAPI解码流程
 当程序把视频的压缩数据传递到VAAPI解码模块时,会根据视频的压缩格式(如H.264.MPEG-2等)创建对应的VADecoder,然后把数据送入VADecoder进行解码,最后由vaPutSurface来处理视频解码后的合成和渲染,具体过程如下:


image.jpg

(三)具体实现
 基于VAAPI和FFmpeg的解码流程图如下:


image.jpg

 由于灵跃桌面云使用的FFmpeg的版本是3.3版本,里面集成了VAAPI中对视频的细节处理,所以只需要在AVCodecContext的get_format回调函数中指定硬解参数,解码后的视频数据会存储在GPU内存中,通过vaPutSruface函数来处理后期的合成和图像渲染,下图为窗口创建和图像处理的过程图:


image.jpg

3.测试结果

 本次测试为对比使用GPU硬解和CPU软解的CPU占用率,视频参数:分辨率1920*1080 、帧率25FPS、编码格式H.264。灵跃桌面云依据测试结果可以看出,使用GPU硬解能大大降低CPU使用率,同时画面输出更加清晰流畅。


image.png

4.写在最后

 至此,灵跃桌面云基于VAAPI 的硬件加速技术介绍完毕。在实际的应用场景中,还可进一步与视频重定向结合,关于视频重定向的结合应用将在后续更新,请持续关注灵跃桌面云公众号更新。
本文转载于 灵跃云 : 原文链接

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 原文地址:http://blog.csdn.net/yipie/article/details/7912291 摘...
    冬的天阅读 11,986评论 1 6
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 176,683评论 25 709
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 14,753评论 4 61
  • 我是日记星球253号星宝宝~左素骊,我正在参加日记星球21天蜕变之旅,这是我的第2篇原创日记。 母亲的爱...
    素骊阅读 3,421评论 0 0
  • 你爱脚下的土地么?他厚重、繁华,载着房子、载着车子以及那些向外飞逐的鸟儿;你爱头上的云朵么?她轻灵、无言,载着太...
    纳兰筱D阅读 1,423评论 0 1

友情链接更多精彩内容