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-libfdk-aac \
  --enable-libmp3lame \
  --enable-libx264 \
  --enable-nvenc \
  --extra-cflags=-I/root/workspace/Video_Codec_SDK_7.1.9/Samples/common/inc \
  --extra-ldflags=-L/root/workspace/Video_Codec_SDK_7.1.9/Samples/common/lib/linux/x86_64 \
  --enable-shared \
  --enable-gpl \
  --enable-postproc \
  --enable-nonfree \
  --enable-avfilter \
  --enable-pthreads

3.1.2 make

运行make & make install

3.2 ffmpeg测试

运行ffmpeg -codecs|grep nvenc
显示一下信息说明

ffmpeg version 3.0.git Copyright (c) 2000-2016 the FFmpeg developersbuilt with gcc 5.4.0 (Ubuntu 5.4.0-6ubuntu1~16.04.1) 20160609configuration: --enable-version3 --enable-libfdk-aac --enable-libmp3lame --enable-libx264 --enable-nvenc --extra-cflags=-I/workspace/Video_Codec_SDK_7.1.9/Samples/common/inc --extra-ldflags=-L/workspace/Video_Codec_SDK_7.1.9/Samples/common/lib/linux/x86_64 --enable-shared --enable-gpl --enable-postproc --enable-nonfree --enable-avfilter --enable-pthreadslibavutil      55. 29.100 / 55. 29.100libavcodec     57. 54.100 / 57. 54.100libavformat    57. 48.100 / 57. 48.100libavdevice    57.  0.102 / 57.  0.102libavfilter     6. 57.100 /  6. 57.100libswscale      4.  1.100 /  4.  1.100libswresample   2.  1.100 /  2.  1.100libpostproc    54.  0.100 / 54.  0.100DEV.LS h264                 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 (encoders: libx264 libx264rgb h264_nvenc nvenc nvenc_h264 )DEV.L. hevc                 H.265 / HEVC (High Efficiency Video Coding) (encoders: nvenc_hevc hevc_nvenc )

其中前缀含义如下:
前缀含义
D….. = Decoding supported
.E…. = Encoding supported
..V… = Video codec
..A… = Audio codec
..S… = Subtitle codec
…I.. = Intra frame-only codec
….L. = Lossy compression
…..S = Lossless compression

3.3 编解码器使用方法

h265编码测试
(1). ffmpeg -s 1920x1080 -pix_fmt yuv420p -i BQTerrace_1920x1080_60.yuv -vcodec hevc_nvenc -r 60 -y 2_60.265
(2). ffmpeg -s 1920x1080 -pix_fmt yuv420p -i BQTerrace_1920x1080_60.yuv -vcodec hevc_nvenc -r 30 -y 2_30.265

h264编码测试
(3). ffmpeg -s 1920x1080 -pix_fmt yuv420p -i BQTerrace_1920x1080_60.yuv -vcodec h264_nvenc -r 60 -y 2_60.264
(4). ffmpeg -s 1920x1080 -pix_fmt yuv420p -i BQTerrace_1920x1080_60.yuv -vcodec h264_nvenc -r 30 -y 2_30.264

h264转h265
(5). ffmpeg -i 1_60.264 -vcodec hevc_nvenc -r 60 -y 2_60_264to265.265
(6). ffmpeg -i 1_30.264 -vcodec hevc_nvenc -r 30 -y 2_30_264to265.265

h265转h264
(7). ffmpeg -i 1_60.265 -vcodec h264_nvenc -r 60 -y 2_60_265to264.264
(8). ffmpeg -i 1_30.265 -vcodec h264_nvenc -r 30 -y 2_30_265to264.264

3.4 程序开发使用方法

av_find_encoder_by_name(“h264_nvenc”);
av_find_encoder_by_name(“hevc_nvenc”);

4. 辅助工具

watch -n 1 nvidia-smi
以1秒钟为间隔来查看GPU资源占用情况

5. 实测结果

5.1 硬件性能

本人用Geforce GTX1070与Tesla P4进行了测试,两者都是Pascal架构。
(1). GTX1070的硬件信息如下(deviceQuery显示):

CUDA Device Query (Runtime API) version (CUDART static linking)
Detected 1 CUDA Capable device(s)
Device 0: "GeForce GTX 1070"CUDA Driver Version / Runtime Version          8.0 / 8.0CUDA Capability Major/Minor version number:    6.1Total amount of global memory:                 8110 MBytes (8504279040 bytes)(15) Multiprocessors, (128) CUDA Cores/MP:     1920 CUDA CoresGPU Max Clock rate:                            1683 MHz (1.68 GHz)Memory Clock rate:                             4004 MhzMemory Bus Width:                              256-bitL2 Cache Size:                                 2097152 bytesMaximum Texture Dimension Size (x,y,z)         1D=(131072), 2D=(131072, 65536), 3D=(16384, 16384, 16384)Maximum Layered 1D Texture Size, (num) layers  1D=(32768), 2048 layersMaximum Layered 2D Texture Size, (num) layers  2D=(32768, 32768), 2048 layersTotal amount of constant memory:               65536 bytesTotal amount of shared memory per block:       49152 bytesTotal number of registers available per block: 65536Warp size:                                     32Maximum number of threads per multiprocessor:  2048Maximum number of threads per block:           1024Max dimension size of a thread block (x,y,z): (1024, 1024, 64)Max dimension size of a grid size    (x,y,z): (2147483647, 65535, 65535)Maximum memory pitch:                          2147483647 bytesTexture alignment:                             512 bytesConcurrent copy and kernel execution:          Yes with 2 copy engine(s)Run time limit on kernels:                     YesIntegrated GPU sharing Host Memory:            NoSupport host page-locked memory mapping:       YesAlignment requirement for Surfaces:            YesDevice has ECC support:                        DisabledDevice supports Unified Addressing (UVA):      YesDevice PCI Domain ID / Bus ID / location ID:   0 / 5 / 0Compute Mode:< Default (multiple host threads can use ::cudaSetDevice() with device simultaneously) >
deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 8.0, CUDA Runtime Version = 8.0, NumDevs = 1, Device0 = GeForce GTX 1070
Result = PASS

(2). P4的硬件信息如下:

 CUDA Device Query (Runtime API) version (CUDART static linking)
Detected 1 CUDA Capable device(s)
Device 0: "Tesla P4"CUDA Driver Version / Runtime Version          8.0 / 8.0CUDA Capability Major/Minor version number:    6.1Total amount of global memory:                 7606 MBytes (7975862272 bytes)(20) Multiprocessors, (128) CUDA Cores/MP:     2560 CUDA CoresGPU Max Clock rate:                            1114 MHz (1.11 GHz)Memory Clock rate:                             3003 MhzMemory Bus Width:                              256-bitL2 Cache Size:                                 2097152 bytesMaximum Texture Dimension Size (x,y,z)         1D=(131072), 2D=(131072, 65536), 3D=(16384, 16384, 16384)Maximum Layered 1D Texture Size, (num) layers  1D=(32768), 2048 layersMaximum Layered 2D Texture Size, (num) layers  2D=(32768, 32768), 2048 layersTotal amount of constant memory:               65536 bytesTotal amount of shared memory per block:       49152 bytesTotal number of registers available per block: 65536Warp size:                                     32Maximum number of threads per multiprocessor:  2048Maximum number of threads per block:           1024Max dimension size of a thread block (x,y,z): (1024, 1024, 64)Max dimension size of a grid size    (x,y,z): (2147483647, 65535, 65535)Maximum memory pitch:                          2147483647 bytesTexture alignment:                             512 bytesConcurrent copy and kernel execution:          Yes with 2 copy engine(s)Run time limit on kernels:                     YesIntegrated GPU sharing Host Memory:            NoSupport host page-locked memory mapping:       YesAlignment requirement for Surfaces:            YesDevice has ECC support:                        EnabledDevice supports Unified Addressing (UVA):      YesDevice PCI Domain ID / Bus ID / location ID:   0 / 5 / 0Compute Mode:< Default (multiple host threads can use ::cudaSetDevice() with device simultaneously) >
deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 8.0, CUDA Runtime Version = 8.0, NumDevs = 1, Device0 = Tesla P4
Result = PASS

5.2 实验结果

(1). GTX1070
| | hevc编码 | h264编码 | h264转h265 | h265转h264 |
| 60fps | 387fps(6.45x) | 430fps(7.17x) | 348fps(5.79x) | 170fps(2.84x) |
| 30fps | 345fps(11.5x) | 429fps(14.3x) | 318fps(10.6x) | 94fps(3.13x) |
(2). P4

| | hevc编码 | h264编码 | h264转h265 | h265转h264 |
| 60fps | 235fps(3.91x) | 334fps(5.57x) | 217fps(3.63x) | 171fps(2.85x) |
| 30fps | 212fps(7.07x) | 322fps(10.7x) | 198fps(6.59x) | 94fps(3.14x) |

5.3 实验分析

虽然在硬件性能上,P4比GTX1070显存略少,主频略低,CUDA的数量多出了33%,但从实验结果上看除了h265->h264结果持平外,P4表现都要逊色于GTX1070,这和官网所言“编解码器独立于CUDA核”相一致。

6. 源码分析

集成在ffmpeg框架内的视频编解码器需要定义一个AVCodec结构体包含(私有结构体AVClass、三个函数等)

6.1 h264部分

(1). 结构体(nvenc_h264.c)

AVCodec ff_h264_nvenc_encoder = {.name           = "h264_nvenc",.long_name      = NULL_IF_CONFIG_SMALL("NVIDIA NVENC H.264 encoder"),.type           = AVMEDIA_TYPE_VIDEO,.id             = AV_CODEC_ID_H264,.init           = ff_nvenc_encode_init, //初始化函数.encode2        = ff_nvenc_encode_frame, //编码函数.close          = ff_nvenc_encode_close, //关闭函数.priv_data_size = sizeof(NvencContext),  //内部数据结构,见nvenc.h.priv_class     = &h264_nvenc_class,     //私有结构体.defaults       = defaults,.capabilities   = AV_CODEC_CAP_DELAY,.caps_internal  = FF_CODEC_CAP_INIT_CLEANUP,.pix_fmts       = ff_nvenc_pix_fmts,
};static const AVClass h264_nvenc_class = {.class_name = "h264_nvenc",.item_name = av_default_item_name,.option = options, //编码器选项参数在这个AVOption结构体中.version = LIBAVUTIL_VERSION_INT,
};

注意还有两个AVCodec,一个名字叫nvenc、一个叫nvenc_h264,对应三大函数与h264_nvenc是一样的
(2). 处理函数(nvenc.c)

av_cold int ff_nvenc_encode_init(AVCodecContext *avctx)
{NvencContext *ctx = avctx->priv_data; //读入私有结构体...//下面是一些nvenc的apinvenc_load_librariesnvenc_setup_devicenvenc_setup_encodernvenc_setup_surfacesnvenc_setup_extradata...
}
int ff_nvenc_encode_frame(AVCodecContext *avctx, AVPacket *pkt,const AVFrame *frame, int *got_packet)
{...if (frame) {inSurf = get_free_frame(ctx); //来一帧...res = nvenc_upload_frame(avctx, frame, inSurf);//编一帧...}
}
av_cold int ff_nvenc_encode_close(AVCodecContext *avctx)
{...//一些free和destroy的工作
}

6.2 h265部分

(1). 结构体(nvenc_hevc.c)

AVCodec ff_hevc_nvenc_encoder = {.name           = "hevc_nvenc",.long_name      = NULL_IF_CONFIG_SMALL("NVIDIA NVENC hevc encoder"),.type           = AVMEDIA_TYPE_VIDEO,.id             = AV_CODEC_ID_HEVC,.init           = ff_nvenc_encode_init, //初始化函数.encode2        = ff_nvenc_encode_frame, //编码函数.close          = ff_nvenc_encode_close, //关闭函数.priv_data_size = sizeof(NvencContext),  //内部数据结构,见nvenc.h.priv_class     = &hevc_nvenc_class, //私有结构体.defaults       = defaults,.pix_fmts       = ff_nvenc_pix_fmts,.capabilities   = AV_CODEC_CAP_DELAY,.caps_internal  = FF_CODEC_CAP_INIT_CLEANUP,
};static const AVClass hevc_nvenc_class = {.class_name = "hevc_nvenc",.item_name = av_default_item_name,.option = options,//编码器选项参数在这个AVOption结构体中.version = LIBAVUTIL_VERSION_INT,
};

注意还有一个AVCodec,一个叫nvenc_hevc,对应三大函数与h264_nvenc是一样的
(2) 处理函数(nvenc.c)
同h264的处理函数

ffmpeg Nvidia硬件加速总结相关推荐

  1. FFMPEG NVIDIA硬件加速总结

    目录 1.NVDIA概述 2.FFmpeg集成到GPU 3.FFmpeg uses Video Codec SDK 4.ffmpeg对NVIDIA GPU的编译步骤 4.1configure命令 4. ...

  2. 使用 ffmpeg 转码 视频 (使用 nvidia 硬件加速 和 h265 编码)

    原来使用 staxrip 的 nvidia加速 转码一堆录像到 x265,码率大概为2000,画质很渣,虽然也许很大一部分是我不会调或者调错参数的原因 orz. 使用 libx265 编码质量很好,但 ...

  3. ffmpeg使用硬件加速hwaccel、cuvid、h264_cuvid、h264_nvenc

    文章目录 ffmpeg支持硬件加速的原理 所用环境说明 ffmpeg使用硬件加速 安装nvidia驱动 安装cuda 加入header 安装pkgconfig 开始配置 在ffmpeg中看如何使用硬件 ...

  4. ffmpeg利用NVIDIA硬件加速编译

    引言 前面有水另外两篇不同的ffmpeg编译的博文,主要是针对不同的命令与相关的调用形式,如果只是在shell命令下直推视频,普通编译加搭建srs3就好了,而如果是需要配合python或者其它编程语言 ...

  5. ffmpeg Intel硬件加速总结

    0. 概述 FFmpeg可通过Intel的GPU进行加速,加速器的名称是Intel Quick Sync Video,简称qsv,支持该加速器的Intel处理器的型号是带有Intel Iris gra ...

  6. FFmpeg视频解码硬件加速

    <音视频应用开发系列文章目录> ffmpeg支持的硬件解码器 enum AVHWDeviceType {AV_HWDEVICE_TYPE_NONE,AV_HWDEVICE_TYPE_VDP ...

  7. ffmpeg gpu硬件加速

    整理下自己百度以及实验成功的结果 0. 成功截图. 一开始, 我用cpu去跑, 速度大约在 3-5 s 这样子. 用gpu去跑,速度就到15-20 这个样子. 确实快了很多. 1. 环境安装及检查. ...

  8. FFmpeg再学习 -- 硬件加速编解码

    为了搞硬件加速编解码,用了一周时间来看 CUDA,接下来开始加以总结. 一.什么是 CUDA (1)首先需要了解一下,什么是 CUDA. 参看:百度百科 -- CUDA 参看:CUDA基础介绍 参看: ...

  9. [FFMPEG硬件加速]nvidia方案

    1.目标 <1>显卡性能参数: <2>方案可行性: 2.平台信息 2.1.查看当前显卡信息 命令:  lspci |grep VGA  信息:  01:00.0 VGA com ...

最新文章

  1. 首次使用批处理框架 Spring Batch ,被震撼到了,太强大...
  2. 【算法基础】数据结构导论第一章-绪论.pptx
  3. android 6.0权限封装,Android6.0------权限申请管理(单个权限和多个权限申请)
  4. java字符串除法函数,java – 函数式编程:如何处理函数式编程中的异常或它的等价物...
  5. java内存四大区,jvm基础-内存区域
  6. mysql密码命名规则_MySql命名规范
  7. 图解Http学习第二章
  8. Visual Studio / Thrift C++ 环境配置,编译安装
  9. Full RangeLimited Range
  10. 现有Unity项目修改渲染管线
  11. SketchUp2020下载SketchUp2020下载安装SketchUp草图大师2020下载安装详细教程
  12. 清华团队夺冠清华-新南威尔士中澳数据科学大赛!跨学科交叉人才走出国门
  13. win10u盘一直正在计算机,Windows10未插入U盘却一直显示的解决方法
  14. ubtuntu error:E45:‘readonly’ option is set(add ! to override
  15. Markdown、.bib、LaTeX + Typora、Pandoc 管理论文参考文献
  16. c语言代码后return0表示什么意思,return 0是什么意思 ?
  17. 关于 C/S模式,B/S模式,P2P模式
  18. WIFI智能插座Homekit
  19. 魅蓝3卡插上显示无服务器,给魅蓝3插卡的方法步骤 _ 路由器设置|192.168.1.1|无线路由器设置|192.168.0.1 - 路饭网...
  20. B站自定义视频播放速度

热门文章

  1. 防火门-13869833139-杜子
  2. 易语言学习笔记(2)
  3. 如何停止计算机usb端口,usb端口,教您如何禁用USB接口
  4. python2 TopLevel主窗体弹子窗体,标题名不对
  5. VScode Java代码自动生成器
  6. EDW DWM CONCEPT
  7. 【ParaView教程】第四章 常见问题 —— 怎样在ParaView中对不同的切面分别积分计算并保存输出?
  8. 计蒜客2018 蓝桥杯省赛 B 组模拟赛(一)
  9. html 轮播图+二级菜单制作
  10. html input怎么限制字数,搞了个输入框限制字数