ffmpeg利用NVIDIA硬件加速编译

引言

前面有水另外两篇不同的ffmpeg编译的博文,主要是针对不同的命令与相关的调用形式,如果只是在shell命令下直推视频,普通编译加搭建srs3就好了,而如果是需要配合python或者其它编程语言,这时候还要加上libx264、yasm等进行兼容,提高效率,前面两篇链接如下:

ffmpeg源码带libx264安装并用ffplay推流测试

ffmpeg与srs3编译以及常用命令测试总结

NVIDIA驱动检查

这里需要检查的东西是cuda和cudnn是否已经安装成功并适配显卡驱动,具体的安装与测试方法我在之前的文章有说明:

Linux下从0开始GPU环境搭建与启动测试

确认无误后就进入下一步。

ffmpeg安装

首先检查一下当前系统是否依赖都齐全了,如果要使用yasm汇编编译器、libx264 H.264视频编码器是否都有,相关的依赖还可以再用命令检查一遍:

sudo apt install libfdk-aac-dev libmp3lame-dev libx264-dev libx265-dev libsdl2-dev

在有ffmpeg解压好的文件夹的前提下,我们还需要进入ffmpeg文件夹下拉取NVIDIA的nvidia codec头文件,这是ffmpeg开启GPU必不可少的一个文件库,我们需要拉取下来并进行编译:

git clone https://git.videolan.org/git/ffmpeg/nv-codec-headers.git
make
sudo make install

在这里插入图片描述
确保无误后进入ffmpeg的重新编译。

如果时间比较多,推荐看看NVIDIA官方出品的Using_FFmpeg_with_NVIDIA_GPU_Hardware_Acceleration.pdf,基本上所有博客或者安装笔记都是照着这个PDF在安装,只不过最后的configure方式不同,NVIDIA只给了一个通用格式,下图为PDF中它介绍的版本:
在这里插入图片描述
这里我的编译命令与方式如下:

# PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
./configure --prefix=/usr/local/ffmpeg --enable-cuda-nvcc --enable-cuvid --enable-shared --enable-nvenc --enable-shared --extra-libs=-lpthread --extra-libs=-lm --enable-gpl --enable-libx264 --extra-cflags=-I/usr/local/cuda/include --extra-ldflags=-L/usr/local/cuda/lib64 --enable-nonfree

make -j8
make install

如果提示找不到依赖库找不到安装目录,上述configure中还需加上PKG_CONFIG_PATH=/usr/local/lib/pkgconfig放在configure前,否则会报错为ERROR: cuda requested, but not all dependencies are satisfied: ffnvcodec。具体的原理可以网上搜索 configure, pkg-config , PKG_CONFIG_PATH这三者直接的关系,我这里就不再赘述。编译的时候开启多进程为8个,这样速度会快很多,因为ffmpeg只要configure不报错,基本上make不会出现问题。

扫描二维码关注公众号,回复: 11442721 查看本文章

上面具体的编译参数可以查看我下面列举的表格,在这里做个记录:

命令

帮助信息

--help

显示此帮助信息|print this message

--log[=FILE|yes|no]

记录测试并输出到config.err文件|log tests and output to FILE [config.err]

--prefix=PREFIX

安装程序到指定目录(默认/usr/local|install in PREFIX [/usr/local]

--libdir=DIR

安装库到指定目录(默认prefix/lib|install libs in DIR [PREFIX/lib]

--shlibdir=DIR

指定共享库路径(默认prefix/lib|install shared libs in DIR [PREFIX/lib]

--incdir=DIR

指定includes路径(默认prefix/include/ffmpeg|install includes in DIR[PREFIX/include/ffmpeg]

--mandir=DIR

指定man page路径(默认prefix/maninstall man page in DIR [PREFIX/man]

--enable-mp3lame

启用mp3编码libmp3lame(默认关闭)enable MP3 encoding via libmp3lame[default=no]

--enable-libogg

启用ogg支持libogg(默认关闭)enable Ogg support via libogg [default=no]

--enable-vorbis

启用Vorbis支持libvorbis(默认关闭)enable Vorbis support via libvorbis [default=no]

--enable-faad

启用faad支持libfaad(默认关闭)enable FAAD support via libfaad [default=no]

--enable-faadbin

启用faad运行时链接支持(默认关闭)build FAAD support with runtime linking[default=no]

--enable-faac

启用faac支持libfaac(默认关闭)enable FAAC support via libfaac [default=no]

--enable-libgsm

启用GSM支持libgsm(默认关闭)enable GSM support via libgsm [default=no]

--enable-xvid

启用xvid支持xvidcore(默认关闭)enable XviD support via xvidcore [default=no]

--enable-libx264

启用H.264编码(默认关闭)enable H.264 encoding via x264 [default=no]

--enable-mingw32

启用MinGW本地/交叉win环境编译|enable MinGW native/cross Windows compile

--enable-mingwce

启用MinGW本地/交叉winCE环境编译enable MinGW native/cross WinCE compile

--enable-a52

启用A52支持(默认关闭)enable GPLed A52 support [default=no]

--enable-a52bin

启用运行时打开liba52.so.0(默认关闭)open liba52.so.0 at runtime [default=no]

--enable-dts

启用DTS支持(默认关闭)enable GPLed DTS support [default=no]

--enable-pp

启用后加工支持(默认关闭)enable GPLed postprocessing support [default=no]

--enable-static

构建静态库(默认启用)build static libraries [default=yes]

--disable-static

禁止构建静态库(默认关闭)do not build static libraries [default=no]

--enable-shared

构建共享库(默认关闭)build shared libraries [default=no]

--disable-shared

禁止构建共享库(默认启用)do not build shared libraries [default=yes]

--enable-amr_nb

启用amr_nb float音频编解码器|enable amr_nb float audio codec

--enable-amr_nb-fixed

启用fixed amr_nb codec | use fixed point for amr-nb codec

--enable-amr_wb

启用amr_wb float音频编解码器|enable amr_wb float audio codec

--enable-amr_if2

启用amr_wb IF2音频编解码器|enable amr_wb IF2 audio codec

--enable-sunmlib

启用Sun medialib(默认关闭)| use Sun medialib [default=no]

--enable-pthreads

启用pthreads(多线程)(默认关闭)use pthreads [default=no]

--enable-dc1394

启用libdc1394libraw1394抓取IIDC-1394(默认关闭)enable IIDC-1394 grabbing using libdc1394 and libraw1394 [default=no]

--enable-swscaler

启用计数器支持?(默认关闭)software scaler support [default=no]

--enable-avisynth

允许读取AVISynth脚本本件(默认关闭)allow reading AVISynth script files [default=no]

--enable-gpl

允许使用GPL(默认关闭)allow use of GPL code, the resulting libav* and ffmpeg will be under GPL [default=no]

编译成功后,我们可以进行测试,命令为:

ffmpeg -hwaccels

# 查看硬解码器
ffmpeg -codecs | grep cuvid

# 查看硬编码器
ffmpeg -codecs | grep nvenc

在这里插入图片描述
看见有cuda和cuvid即为成功。

而如果看前面的第一篇文章,装了srs的话就能进行本地推流测试了:

ffmpeg -hwaccel cuvid -c:v h264_cuvid -rtsp_transport tcp -i "rtsp://admin:admin@127.00.1:1935/H264?channel=1&subtype=0&unicast=true&proto=Onvif/video
" -c:v h264_nvenc -b:v 2048k -vf scale_npp=1280:-1 -y /home/2.mp4

猜你喜欢

转载自blog.csdn.net/submarineas/article/details/107039296