引言
前面有水另外两篇不同的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不会出现问题。
上面具体的编译参数可以查看我下面列举的表格,在这里做个记录:
命令 |
帮助信息 |
--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/man)install 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 |
启用libdc1394、libraw1394抓取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.0。0.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