当前位置:首页 > 技术知识 > 正文内容

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

maynowei6个月前 (09-13)技术知识50

1. 写在前面

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

2. 实现方案

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

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查看执行结果

图中红框内表示当前所支持硬解的视频压缩格式。

(三)安装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查看执行结果。

领取C++音视频开发学习资料:点击→音视频开发(资料文档+视频教程+面试题)(FFmpeg+WebRTC+RTMP+RTSP+HLS+RTP)

2.2 代码实现

(一)视频播放原理

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

(二)VAAPI解码流程

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

(三)具体实现

基于VAAPI和FFmpeg的解码流程图以下:

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

3. 测试结果

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

相关文章

去哪儿暑期PM实习一月记:在互联网公司做产品实习是怎样一种体验

人人都是产品经理旗下【起点学院】推出产品经理“365天”成长计划,BAT大牛带你学产品! 在毕业前的最后一个暑假,缘分使然找了几个月暑期实习之后进入了去哪儿,申请提前入职工作至今正好满一个月。原先有在...

ExpandListView 的一种巧妙写法(三十的另一种写法)

ExpandListView大家估计也用的不少了,一般有需要展开的需求的时候,大家不约而同的都想到了它然后以前自己留过记录的一般都会找找以前自己的代码,没有记录习惯的就会百度、谷歌,这里吐槽一下,好几...

大厂 Go 编程规范(二):mutex(编程大厂是什么意思)

mutex 是golang 的互斥锁,可以保障在多协程的情况下,数据访问的安全。1、零值有效我们并不需要mutex指针mu := new(sync.Mutex) mu.Lock()直接可以使用mute...

大量类加载器创建导致诡异FullGC(类的加载器有什么用)

“ 由 GC 问题带你全面了解 JDK8 Metaspace”01—现象最近接手了一个同事的项目,某一天接口的响应耗时突然增加了很多,由几十ms 增加到了几十秒。首先查看机器上的日志,有调用第三方接口...

Navicat Premium 连接 Oracle 数据库

Navicat Premium是一个可多重连接的数据库管理工具,它可让你以单一程序同時连接到 MySQL、SQLite、Oracle 及 PostgreSQL 数据库,让管理不同类型的数据库更加方便。...

Oracle高级数据库特性揭秘:存储过程、触发器与权限管理

当谈论Oracle高级数据库特性时,存储过程和函数、触发器、权限管理和安全性以及数据库连接和远程访问是关键概念。下面我将为每个主题提供详细的解释,并附上高质量示例。存储过程和函数: 存储过程和函数是预...