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

转载自 灵跃云 :原文链接

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

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使用率,同时画面输出更加清晰流畅。


解码类型


CPU占用百分比


基于VAAPI的GPU硬解


4%


基于CPU软解


50%

4. 写在最后

至此,灵跃桌面云基于VAAPI 的硬件加速技术介绍完毕。

时间: 2024-11-13 09:42:38

基于FFmpeg+VAAPI的硬件加速渲染技术的相关文章

Android应用程序UI硬件加速渲染技术简要介绍和学习计划

Android系统的流畅性一直被拿来与iOS比较,并且认为不如后者.这一方面与Android设备硬件质量参差不齐有关,另一方面也与Android系统的实现有关.例如在3.0前,Android应用程序UI绘制不支持硬件加速.不过从4.0开始,Android系统一直以"run fast, smooth, and responsively"为目标对UI进行优化.本文对这些优化进行简要介绍和制定学习计划. 老罗的新浪微博:http://weibo.com/shengyangluo,欢迎关注!

Chromium硬件加速渲染的UI合成过程分析

在Chromium中,Render端和WebGL端绘制出来的UI最终是通过Browser端显示在屏幕上的.换句话说,就是Browser端负责合成Render端和WebGL端的UI.这涉及到不同OpenGL上下文之间的资源传递和同步问题.其中,资源传递问题通过Mailbox机制解决,同步问题通过Sync Point机制解决.本文接下来就分析Browser端合成Render端和WebGL端UI的过程. 老罗的新浪微博:http://weibo.com/shengyangluo,欢迎关注! Rende

Android应用程序UI硬件加速渲染的Display List渲染过程分析

在硬件加速渲染环境中,Android应用程序窗口的UI渲染是分两步进行的.第一步是构建Display List,发生在应用程序进程的Main Thread中:第二步是渲染Display List,发生在应用程序进程的Render Thread中.Display List的渲染不是简单地执行绘制命令,而是包含了一系列优化操作,例如绘制命令的合并执行.本文就详细分析Display List的渲染过程. 老罗的新浪微博:http://weibo.com/shengyangluo,欢迎关注! 从前面An

Chromium硬件加速渲染的OpenGL上下文调度过程分析

Chromium的每一个WebGL端.Render端和Browser端实例在GPU进程中都有一个OpenGL上下文.这些OpenGL上下文运行在相同线程中,因此同一时刻只有一个OpenGL上下文处于运行状态.这就引发出一个OpenGL上下文调度问题.此外,事情有轻急缓重,OpenGL上下文也有优先级高低之分,优先级高的要保证它的运行时间.本文接下来就分析GPU进程调度运行OpenGL上下文的过程. 老罗的新浪微博:http://weibo.com/shengyangluo,欢迎关注! 在前面Ch

Chromium硬件加速渲染的GPU数据上传机制分析

在Chromium中,WebGL端.Render端和Browser端通过命令缓冲区将GPU命令发送给GPU进程执行.GPU命令携带的简单参数也通过命令缓冲区发送给GPU进程,但是复杂参数,例如纹理数据,有可能太大以致命令缓冲区无法容纳,因此需要通过其它机制传递给GPU进程.本文接下来就主要以纹理数据上传为例,分析WebGL端.Render端和Browser端将GPU命令数据传递给GPU进程的机制. 老罗的新浪微博:http://weibo.com/shengyangluo,欢迎关注! WebGL

Chromium硬件加速渲染的OpenGL上下文绘图表面创建过程分析

GPU命令需要在OpenGL上下文中执行.每一个OpenGL上下文都关联有一个绘图表面,GPU命令就是作用在绘图表面上的.不同用途的OpenGL上下文关联的绘图表面不一样,例如用于离屏渲染的OpenGL上下文关联的绘图表面可以用Pbuffer描述,而用于屏幕渲染的OpenGL上下文的绘图表面要用本地窗口描述.本文分析Chromium硬件加速渲染涉及到的OpenGL上下文及其联的绘图表面的关联过程. 老罗的新浪微博:http://weibo.com/shengyangluo,欢迎关注! 从前面Ch

Android应用程序UI硬件加速渲染的预加载资源地图集服务(Asset Atlas Service)分析

我们知道,Android系统在启动的时候,会对一些系统资源进行预加载.这样不仅使得应用程序在需要时可以快速地访问这些资源,还使得这些资源能够在不同应用程序之间进行共享.在硬件加速渲染环境中,这些预加载资源还有进一步优化的空间.Android系统提供了一个地图集服务,负责将预加载资源合成为一个纹理上传到GPU去,并且能够在所有的应用程序之间进行共享.本文就详细分析这个预加载资源地图集服务的实现原理. 老罗的新浪微博:http://weibo.com/shengyangluo,欢迎关注! 资源预加载

Chromium硬件加速渲染的OpenGL命令执行过程分析

在Chromium中,由于GPU进程的存在,WebGL端.Render端和Browser端的GPU命令是代理给GPU进程执行的.Chromium将它们要执行的GPU命令进行编码,然后写入到一个命令缓冲区中,最后传递给GPU进程.GPU进程从这个命令缓冲区读出GPU命令之后,就进行解码,然后调用对应的OpenGL函数.本文就详细分析WebGL端.Render端和Browser端执行GPU命令的过程. 老罗的新浪微博:http://weibo.com/shengyangluo,欢迎关注! 在前面Ch

Android应用程序UI硬件加速渲染环境初始化过程分析

在Android应用程序中,我们是通过Canvas API来绘制UI元素的.在硬件加速渲染环境中,这些Canvas API调用最终会转化为Open GL API调用(转化过程对应用程序来说是透明的).由于Open GL API调用要求发生在Open GL环境中,因此在每当有新的Activity窗口启动时,系统都会为其初始化好Open GL环境.这篇文章就详细分析这个Open GL环境的初始化过程. 老罗的新浪微博:http://weibo.com/shengyangluo,欢迎关注! Open