0. 概述
FFmpeg可通过Nvidia的GPU进行加速,其中高层接口是通过Video Codec SDK来实现GPU资源的调用。Video Codec SDK包含完整的的高性能工具、源码及文档,支持,可以运行在Windows和Linux系统之上。从软件上来说,SDK包含两类硬件加速接口,用于编码加速的NVENCODE API和用于解码加速的NVDECODE API(之前被称为NVCUVID API)。从硬件上来说,Nvidia GPU有一到多个编解码器(解码器又称硬件加速引擎),它们独立于CUDA核。从视频格式上来说,编码支持H.264、H.265、无损压缩,位深度支持8bit、10bit,色域空间支持YUV 4:4:4和4:2:0,分辨率支持最高8K;解码支持MPEG-2、VC1、VP8、VP9、H.264、H.265、无损压缩,位深度支持8 bit、10bit、12bit,色域空间支持YUV 4:2:0,分辨率支持最高8K。Video Codec SDK已经被集成在ffmpeg工程中,但是ffmpeg对编解码器配置参数较少,如果需要充分的发挥编解码器特性,还需要直接使用SDK进行编程。
Nvidia编码器与CPU上的x264的性能对比与质量对比如下图所示,性能以每秒钟编码帧数为参考指标,质量以PSNR为参考指标。
可看出性能方面Nvidia编码器是x264的2~5倍,质量方面对于fast stream场景来说Nvidia编码器优于x264,高质量场景来说低于x264,但没有说明是哪款Nvidia的产品,以及对比测试的x264运行平台的CPU的型号及平台能力。下图可以看出对于1080P@30fps,NVENC可支持21路的编码或9路的高质量编码。
不同型号的GPU的编码的能力表格如下:
Nvidia解码器性能指标如下图所示,不过只有两款Tesla的产品。
解码的能力表格如下:
1. 安装驱动与SDK
1.1 前期准备
需要关闭所有开源的显示驱动
vi /etc/modprobe.d/blacklist.conf
添加
blacklist amd76x_edac
blacklist vga16fb
blacklist nouveau
blacklist nvidiafb
blacklist rivatv
1.2 驱动安装
(1). 删除原来的驱动
apt-get remove –purge nvidia*
(2). 官方下载run文件的驱动进行安装
service lightdm stop
chmod 777 NVIDIA-Linux-x86_64-367.44.run
./NVIDIA-Linux-x86_64-367.44.run
service lightdm start
reboot
(2). 驱动安装验证
运行nvidia-smi,有如下输出则安装成功
问题1:如果重启之后发现图形界面进不去,发生了循环登录,说明视频驱动没有安装完全,需要重装驱动,保险的方法是联网安装
console中执行
apt-get remove –purge nvidia-*
add-apt-repository ppa:graphics-drivers/ppa
apt-get update
service lightdm stop
apt-get install nvidia-375 nvidia-settings nvidia-prime
nvidia-xconfig
apt-get install mesa-common-dev //安装缺少的库
apt-get install freeglut3-dev
update-initramfs -u
reboot
1.3 SDK安装
(1). 官方下载run文件的驱动进行安装
cuda_8.0.44_linux.run –no-opengl-libs //不需要opengl支持
apt-get install freeglut3-dev build-essential libx11-dev
apt-get install libxmu-dev libxi-dev libgl1-mesa-glx libglu1-mesa
apt-get install libglu1-mesa-dev
gedit ~/.bashrc
添加
export PATH=/usr/local/cuda/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH
gedit /etc/ld.so.conf.d/cuda.conf
添加
/usr/local/cuda/lib64
/lib
/lib32
/lib64
/usr/lib
/user/lib32
sudo ldconfig
(2). SDK安装验证
运行nvcc -V,有如下输出则安装成功。
2. Sample测试
2.1 Sample编译
进入Samples目录,运行make,如果没有安装OpenGL相关库,则NvDecodeGL会编译不通过
每个工程的含义可参考《NVIDIA_Video_Codec_SDK_Samples_Guide》
NvEncoder: 基本功能的编码
NvEncoderCudaInterpo: CUDA surface的编码
NvEncoderD3D9Interpo: D3D9 surface的编码,Linux下没有
NvEncoderLowLatency: 低延时特征的使用,如帧内刷新与参考图像有效性(RPI)
NvEncoderPerf: 最大性能的编码
NvTranscoder: NVENC的转码能力
NvDecodeD3D9: 视频解码D3D9显示,Linux下没有
NvDecodeD3D11: 视频解码D3D11显示,Linux下没有
NvDecodeGL: 视频解码OpenGL显示
2.2 Sample测试
参见《NVIDIA_Video_Codec_SDK_Samples_Guide》
问题2:如果运行例子后显示libcuda.so failed!
在/usr/lib/x86_64-linux-gnu下制作链接libcuda.so,链接至libcuda.so.375.26
3. ffmpeg结合
3.1 ffmpeg编译
3.1.1 前期工作
确保Video_Codec_SDK_7.1.9/Samples/common/inc 目录下有基本的头文件
确保Video_Codec_SDK_7.1.9/Samples/common/lib/linux/x86_64 目录下有libGLEW.a
3.1.2 configure命令
configure \
--enable-version3 \
--enable-