opencv编译指定自定义的ffmpeg版本,cuda加速

opencv源码编译,videoio模块通常会使用ffmpeg库。通常我们在编译opencv源码前,会直接使用命令行安装ffmpeg库,如:

sudo apt-get install libavcodec-dev
sudo apt-get install libavdevice-dev
sudo apt-get install libavfilter-dev
sudo apt-get install libavformat-dev
sudo apt-get install libavutil-dev
sudo apt-get install libswresample-dev
sudo apt-get install libswscale-dev

通常,我们想使用版本的ffmpeg库做开发,或者裁剪保留需要的ffmpeg功能,都需要自己从源码编译ffmpeg库,并集成到opencv以及自己的程序中;同时,也能避免opencv和程序使用两套不同的版本的ffmpeg库,导致依赖过多。

这里直接给出在ubuntu16.04编译opencv后的命令行,带opencv_contriib,rtx2060 cuda 10.1加速的编译命令

cmake -BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/homel \
-DOPENCV_EXTRA_MODULES_PATH=/home/wanggao/software/opencv/opencv-4.2.0/opencv_contrib-4.2.0/modules \
-DOPENCV_DNN_CUDA=True -DWITH_CUDA=True -DCUDA_ARCH_BIN="6.1 7.0 7.5" \
-DBUILD_EXAMPLES=OFF -DWITH_GSTREAMER=OFF -DBUILD_TESTS=OFF -DBUILD_PERF_TESTS=OFF \
../sources

关注cmake之后关于的配置提示,可以看到ffmpeg正是

--   Video I/O:
--     DC1394:                      NO
--     FFMPEG:                      YES
--       avcodec:                   YES (56.60.100)
--       avformat:                  YES (56.40.101)
--       avutil:                    YES (54.31.100)
--       swscale:                   YES (3.1.101)
--       avresample:                YES (2.1.0)
--     v4l/v4l2:                    YES (linux/videodev2.h)

查看libopencv_videoio.so的依赖,可以看出队系统的依赖及其的多。然而,opencv依赖ffmpeg仅在图像编解码、视频流解析上,不应该带有音频相关的处理(除非,自己的程序同时使用opencv和音频处理的接口)。

在下面依赖中,也能看到有关ffmpeg库连接到 /usr/lib/x86_64-linux-gnu/libavxxx-ffmpeg.so.xxx

root@ubuntu:/home/wanggao/software/opencv/opencv-4.2.0/build/lib# ldd libopencv_videoio.so
        linux-vdso.so.1 =>  (0x00007ffff6fce000)
        libopencv_imgcodecs.so.4.2 => /home/wanggao/software/opencv/opencv-4.2.0/build/lib/libopencv_imgcodecs.so.4.2 (0x00007ff2d5f3b000)
        libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007ff2d5d37000)
        libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007ff2d5b1a000)
        librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007ff2d5912000)
        libopencv_imgproc.so.4.2 => /home/wanggao/software/opencv/opencv-4.2.0/build/lib/libopencv_imgproc.so.4.2 (0x00007ff2d3fe1000)
        libopencv_core.so.4.2 => /home/wanggao/software/opencv/opencv-4.2.0/build/lib/libopencv_core.so.4.2 (0x00007ff2d28b7000)
        libgstreamer-1.0.so.0 => /usr/lib/x86_64-linux-gnu/libgstreamer-1.0.so.0 (0x00007ff2d258d000)
        libgobject-2.0.so.0 => /usr/local/lib/x86_64-linux-gnu/libgobject-2.0.so.0 (0x00007ff2d232f000)
        libglib-2.0.so.0 => /usr/local/lib/x86_64-linux-gnu/libglib-2.0.so.0 (0x00007ff2d200a000)
        libgstapp-1.0.so.0 => /usr/lib/x86_64-linux-gnu/libgstapp-1.0.so.0 (0x00007ff2d1dfc000)
        libgstriff-1.0.so.0 => /usr/lib/x86_64-linux-gnu/libgstriff-1.0.so.0 (0x00007ff2d1bed000)
        libgstpbutils-1.0.so.0 => /usr/lib/x86_64-linux-gnu/libgstpbutils-1.0.so.0 (0x00007ff2d19b8000)
        libavcodec-ffmpeg.so.56 => /usr/lib/x86_64-linux-gnu/libavcodec-ffmpeg.so.56 (0x00007ff2d0584000)
        libavformat-ffmpeg.so.56 => /usr/lib/x86_64-linux-gnu/libavformat-ffmpeg.so.56 (0x00007ff2d0185000)
        libavutil-ffmpeg.so.54 => /usr/lib/x86_64-linux-gnu/libavutil-ffmpeg.so.54 (0x00007ff2cff16000)
        libswscale-ffmpeg.so.3 => /usr/lib/x86_64-linux-gnu/libswscale-ffmpeg.so.3 (0x00007ff2cfc87000)
        libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007ff2cf905000)
        libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007ff2cf5fc000)
        libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007ff2cf3e6000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ff2cf01c000)
        libjpeg.so.8 => /usr/lib/x86_64-linux-gnu/libjpeg.so.8 (0x00007ff2cedc3000)
        libwebp.so.5 => /usr/lib/x86_64-linux-gnu/libwebp.so.5 (0x00007ff2ceb67000)
        libpng12.so.0 => /lib/x86_64-linux-gnu/libpng12.so.0 (0x00007ff2ce942000)
        libtiff.so.5 => /usr/lib/x86_64-linux-gnu/libtiff.so.5 (0x00007ff2ce6cd000)
        libjasper.so.1 => /usr/lib/x86_64-linux-gnu/libjasper.so.1 (0x00007ff2ce478000)
        libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007ff2ce25e000)
        /lib64/ld-linux-x86-64.so.2 (0x00007ff2d6aa6000)
        libcudart.so.10.1 => /usr/local/cuda/lib64/libcudart.so.10.1 (0x00007ff2cdfe2000)
        libgmodule-2.0.so.0 => /usr/local/lib/x86_64-linux-gnu/libgmodule-2.0.so.0 (0x00007ff2cddde000)
        libffi.so.6 => /usr/lib/x86_64-linux-gnu/libffi.so.6 (0x00007ff2cdbd6000)
        libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007ff2cd966000)
        libgstbase-1.0.so.0 => /usr/lib/x86_64-linux-gnu/libgstbase-1.0.so.0 (0x00007ff2cd702000)
        libgstaudio-1.0.so.0 => /usr/lib/x86_64-linux-gnu/libgstaudio-1.0.so.0 (0x00007ff2cd4a5000)
        libgsttag-1.0.so.0 => /usr/lib/x86_64-linux-gnu/libgsttag-1.0.so.0 (0x00007ff2cd26a000)
        libgstvideo-1.0.so.0 => /usr/lib/x86_64-linux-gnu/libgstvideo-1.0.so.0 (0x00007ff2ccfe4000)
        libswresample-ffmpeg.so.1 => /usr/lib/x86_64-linux-gnu/libswresample-ffmpeg.so.1 (0x00007ff2ccdc7000)
        libva.so.1 => /usr/lib/x86_64-linux-gnu/libva.so.1 (0x00007ff2ccbab000)
        libzvbi.so.0 => /usr/lib/x86_64-linux-gnu/libzvbi.so.0 (0x00007ff2cc920000)
        libxvidcore.so.4 => /usr/lib/x86_64-linux-gnu/libxvidcore.so.4 (0x00007ff2cc60c000)
        libx265.so.79 => /usr/lib/x86_64-linux-gnu/libx265.so.79 (0x00007ff2cb9ed000)
        libx264.so.148 => /usr/lib/x86_64-linux-gnu/libx264.so.148 (0x00007ff2cb649000)
        libwavpack.so.1 => /usr/lib/x86_64-linux-gnu/libwavpack.so.1 (0x00007ff2cb420000)
        libvpx.so.3 => /usr/lib/x86_64-linux-gnu/libvpx.so.3 (0x00007ff2caffc000)
        libvorbisenc.so.2 => /usr/lib/x86_64-linux-gnu/libvorbisenc.so.2 (0x00007ff2cad53000)
        libvorbis.so.0 => /usr/lib/x86_64-linux-gnu/libvorbis.so.0 (0x00007ff2cab28000)
        libtwolame.so.0 => /usr/lib/x86_64-linux-gnu/libtwolame.so.0 (0x00007ff2ca905000)
        libtheoraenc.so.1 => /usr/lib/x86_64-linux-gnu/libtheoraenc.so.1 (0x00007ff2ca6c6000)
        libtheoradec.so.1 => /usr/lib/x86_64-linux-gnu/libtheoradec.so.1 (0x00007ff2ca4ac000)
        libspeex.so.1 => /usr/lib/x86_64-linux-gnu/libspeex.so.1 (0x00007ff2ca293000)
        libsnappy.so.1 => /usr/lib/x86_64-linux-gnu/libsnappy.so.1 (0x00007ff2ca08b000)
        libshine.so.3 => /usr/lib/x86_64-linux-gnu/libshine.so.3 (0x00007ff2c9e7e000)
        libschroedinger-1.0.so.0 => /usr/lib/x86_64-linux-gnu/libschroedinger-1.0.so.0 (0x00007ff2c9ba9000)
        libopus.so.0 => /usr/lib/x86_64-linux-gnu/libopus.so.0 (0x00007ff2c995f000)
        libopenjpeg.so.5 => /usr/lib/x86_64-linux-gnu/libopenjpeg.so.5 (0x00007ff2c973c000)
        libmp3lame.so.0 => /usr/lib/x86_64-linux-gnu/libmp3lame.so.0 (0x00007ff2c94c7000)
        libgsm.so.1 => /usr/lib/x86_64-linux-gnu/libgsm.so.1 (0x00007ff2c92b9000)
        libcrystalhd.so.3 => /usr/lib/x86_64-linux-gnu/libcrystalhd.so.3 (0x00007ff2c909e000)
        liblzma.so.5 => /lib/x86_64-linux-gnu/liblzma.so.5 (0x00007ff2c8e7c000)
        libssh-gcrypt.so.4 => /usr/lib/x86_64-linux-gnu/libssh-gcrypt.so.4 (0x00007ff2c8c33000)
        librtmp.so.1 => /usr/lib/x86_64-linux-gnu/librtmp.so.1 (0x00007ff2c8a17000)
        libmodplug.so.1 => /usr/lib/x86_64-linux-gnu/libmodplug.so.1 (0x00007ff2c868c000)
        libgme.so.0 => /usr/lib/x86_64-linux-gnu/libgme.so.0 (0x00007ff2c843e000)
        libbluray.so.1 => /usr/lib/x86_64-linux-gnu/libbluray.so.1 (0x00007ff2c81f5000)
        libgnutls.so.30 => /usr/lib/x86_64-linux-gnu/libgnutls.so.30 (0x00007ff2c7ec5000)
        libbz2.so.1.0 => /lib/x86_64-linux-gnu/libbz2.so.1.0 (0x00007ff2c7cb5000)
        libjbig.so.0 => /usr/lib/x86_64-linux-gnu/libjbig.so.0 (0x00007ff2c7aa7000)
        liborc-0.4.so.0 => /usr/lib/x86_64-linux-gnu/liborc-0.4.so.0 (0x00007ff2c7827000)
        libsoxr.so.0 => /usr/lib/x86_64-linux-gnu/libsoxr.so.0 (0x00007ff2c75c2000)
        libnuma.so.1 => /usr/lib/x86_64-linux-gnu/libnuma.so.1 (0x00007ff2c73b7000)
        libogg.so.0 => /usr/lib/x86_64-linux-gnu/libogg.so.0 (0x00007ff2c71ae000)
        libgcrypt.so.20 => /lib/x86_64-linux-gnu/libgcrypt.so.20 (0x00007ff2c6ecd000)
        libgssapi_krb5.so.2 => /usr/lib/x86_64-linux-gnu/libgssapi_krb5.so.2 (0x00007ff2c6c83000)
        libhogweed.so.4 => /usr/lib/x86_64-linux-gnu/libhogweed.so.4 (0x00007ff2c6a50000)
        libnettle.so.6 => /usr/lib/x86_64-linux-gnu/libnettle.so.6 (0x00007ff2c681a000)
        libgmp.so.10 => /usr/lib/x86_64-linux-gnu/libgmp.so.10 (0x00007ff2c659a000)
        libxml2.so.2 => /usr/lib/x86_64-linux-gnu/libxml2.so.2 (0x00007ff2c61df000)
        libfontconfig.so.1 => /usr/lib/x86_64-linux-gnu/libfontconfig.so.1 (0x00007ff2c5f9c000)
        libfreetype.so.6 => /usr/lib/x86_64-linux-gnu/libfreetype.so.6 (0x00007ff2c5cf2000)
        libp11-kit.so.0 => /usr/lib/x86_64-linux-gnu/libp11-kit.so.0 (0x00007ff2c5a8e000)
        libidn.so.11 => /usr/lib/x86_64-linux-gnu/libidn.so.11 (0x00007ff2c585b000)
        libtasn1.so.6 => /usr/lib/x86_64-linux-gnu/libtasn1.so.6 (0x00007ff2c5648000)
        libgomp.so.1 => /usr/lib/x86_64-linux-gnu/libgomp.so.1 (0x00007ff2c5426000)
        libgpg-error.so.0 => /lib/x86_64-linux-gnu/libgpg-error.so.0 (0x00007ff2c5212000)
        libkrb5.so.3 => /usr/lib/x86_64-linux-gnu/libkrb5.so.3 (0x00007ff2c4f40000)
        libk5crypto.so.3 => /usr/lib/x86_64-linux-gnu/libk5crypto.so.3 (0x00007ff2c4d11000)
        libcom_err.so.2 => /lib/x86_64-linux-gnu/libcom_err.so.2 (0x00007ff2c4b0d000)
        libkrb5support.so.0 => /usr/lib/x86_64-linux-gnu/libkrb5support.so.0 (0x00007ff2c4902000)
        libicuuc.so.55 => /usr/lib/x86_64-linux-gnu/libicuuc.so.55 (0x00007ff2c456e000)
        libexpat.so.1 => /lib/x86_64-linux-gnu/libexpat.so.1 (0x00007ff2c4345000)
        libkeyutils.so.1 => /lib/x86_64-linux-gnu/libkeyutils.so.1 (0x00007ff2c4141000)
        libresolv.so.2 => /lib/x86_64-linux-gnu/libresolv.so.2 (0x00007ff2c3f26000)
        libicudata.so.55 => /usr/lib/x86_64-linux-gnu/libicudata.so.55 (0x00007ff2c246f000)

linux编译,这里只做演示,不对ffmpeg进行裁剪,完整编译所有模块。另外,由于使用了cuda,期望使用硬编码器的h264。

(1)首先,编译配置 nv-codec-headers

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

(2)ffmpeg编译

使用4.0.2版本源码编译。

./configure --enable-shared --enable-nonfree --enable-cuda-sdk --enable-libnpp \
--extra-cflags=-I/usr/local/cuda/include \
--extra-ldflags=-L/usr/local/cuda/lib64 \
--prefix=/home/wanggao/software/FFmpeg-n4.0.2/install

成功后 make & make install即可。

编译之后,可以使用 ffmpeg -hide_banner true -codecs | grep h264查看编译的264相关的编解码器。
若找不到ffmpeg,需要将 install/bin/ffmpeg复制到 install/lib/目录,并在lib目录下运行程序。

root@ubuntu:/home/wanggao/software/FFmpeg-n4.0.2/install/lib# ./ffmpeg
ffmpeg version 4.0.2 Copyright (c) 2000-2018 the FFmpeg developers
  built with gcc 5.4.0 (Ubuntu 5.4.0-6ubuntu1~16.04.12) 20160609
  configuration: --enable-shared --enable-nonfree --enable-cuda-sdk --enable-libnpp --enable-gpl --extra-cflags=-I/usr/local/cuda/include --extra-ldflags=-L/usr/local/cuda/lib64 --prefix=/home/wanggao/software/FFmpeg-n4.0.2/install
  libavutil      56. 14.100 / 56. 14.100
  libavcodec     58. 18.100 / 58. 18.100
  libavformat    58. 12.100 / 58. 12.100
  libavdevice    58.  3.100 / 58.  3.100
  libavfilter     7. 16.100 /  7. 16.100
  libswscale      5.  1.100 /  5.  1.100
  libswresample   3.  1.100 /  3.  1.100
  libpostproc    55.  1.100 / 55.  1.100
Hyper fast Audio and Video encoder
usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...

目前编译后查看支持264的编码器有

./ffmpeg -hide_banner true -codecs | grep 264
 DEV.LS h264    (decoders: h264 h264_v4l2m2m h264_cuvid )
                (encoders: libx264 libx264rgb h264_nvenc h264_v4l2m2m nvenc nvenc_h264 )

如果期望的编解码器未出现或期望使用其他编码器,可以在ffmpeg源码目下使用 ./configure --help查看命令参数。例如这里筛选特定的选项:

./configure --help |grep 264
  --enable-libopenh264     enable H.264 encoding via OpenH264 [no]
  --enable-libx264         enable H.264 encoding via x264 [no]

./configure --help |grep aac
  --enable-libfdk-aac      enable AAC de/encoding via libfdk-aac [no]

./configure --help |grep Nvidia
  --disable-cuvid          disable Nvidia CUVID support [autodetect]
  --disable-ffnvcodec      disable dynamically linked Nvidia code [autodetect]
  --enable-libnpp          enable Nvidia Performance Primitives-based code [no]
  --disable-nvdec          disable Nvidia video decoding acceleration (via hwaccel) [autodetect]
  --disable-nvenc          disable Nvidia video encoding code [autodetect]
  --disable-vdpau          disable Nvidia Video Decode and Presentation API for Unix code [autodetect]
  --nvcc=NVCC              use Nvidia CUDA compiler NVCC [nvcc]

使用264软编码器,添加编译选项 --enable-libx264 --enable-encoder=libx264 --enable-decoder=h264等参数;nvdec 和 nvenc是默认开启的。

临时指定ld、pkg相关目录到ffmpeg,这里是最重要的

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/pathxxxx/FFmpeg-n4.0.2/install/lib/
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/pathxxxx/FFmpeg-n4.0.2/install/lib/pkgconfig/
export PKG_CONFIG_LIBDIR=$PKG_CONFIG_LIBDIR:/pathxxxx/FFmpeg-n4.0.2/install/lib/

执行opencv的cmake命令行,再次查看ffmpeg配置项

--   Video I/O:
--     DC1394:                      NO
--     FFMPEG:                      YES
--       avcodec:                   YES (58.18.100)
--       avformat:                  YES (58.12.100)
--       avutil:                    YES (56.14.100)
--       swscale:                   YES (5.1.100)
--       avresample:                NO
--     v4l/v4l2:                    YES (linux/videodev2.h)

这里看到,版本发生了变化,使用的就是自己编译的ffmpeg库,并且没有使用音频重采样的库(自己编译的名字为libswresample,和opencv定义的使用系统的ffmpeg音频重采样库名称不一样)。

编译opencv之后查看libopencv_videoio.so的依赖,如下确实是成功连接到自定义ffmpeg上了,并且依赖减小了。在下面依赖中,也能看到有关ffmpeg库连接到 /home/wanggao/software/FFmpeg-n4.0.2/install/lib/libavxxx-ffmpeg.so.xxx

root@ubuntu:/home/wanggao/software/opencv/opencv-4.2.0/build_0220/lib# ldd libopencv_videoio.so
        linux-vdso.so.1 =>  (0x00007ffc73387000)
        libopencv_imgcodecs.so.4.2 => /home/wanggao/software/opencv/opencv-4.2.0/build_0220/lib/libopencv_imgcodecs.so.4.

        libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f22e3c5e000)
        libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f22e3a41000)
        librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f22e3839000)
        libopencv_imgproc.so.4.2 => /home/wanggao/software/opencv/opencv-4.2.0/build_0220/lib/libopencv_imgproc.so.4.2 (0
        libopencv_core.so.4.2 => /home/wanggao/software/opencv/opencv-4.2.0/build_0220/lib/libopencv_core.so.4.2 (0x00007
        libavcodec.so.58 => /home/wanggao/software/FFmpeg-n4.0.2/install/lib/libavcodec.so.58 (0x00007f22df4fd000)
        libavformat.so.58 => /home/wanggao/software/FFmpeg-n4.0.2/install/lib/libavformat.so.58 (0x00007f22df12a000)
        libavutil.so.56 => /home/wanggao/software/FFmpeg-n4.0.2/install/lib/libavutil.so.56 (0x00007f22deed8000)
        libswscale.so.5 => /home/wanggao/software/FFmpeg-n4.0.2/install/lib/libswscale.so.5 (0x00007f22dec62000)
        libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f22de8e0000)
        libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f22de5d7000)
        libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f22de3c1000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f22ddff7000)
        libjpeg.so.8 => /usr/lib/x86_64-linux-gnu/libjpeg.so.8 (0x00007f22ddd9e000)
        libwebp.so.5 => /usr/lib/x86_64-linux-gnu/libwebp.so.5 (0x00007f22ddb42000)
        libpng12.so.0 => /lib/x86_64-linux-gnu/libpng12.so.0 (0x00007f22dd91d000)
        libtiff.so.5 => /usr/lib/x86_64-linux-gnu/libtiff.so.5 (0x00007f22dd6a8000)
        libjasper.so.1 => /usr/lib/x86_64-linux-gnu/libjasper.so.1 (0x00007f22dd453000)
        libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f22dd239000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f22e49ba000)
        libcudart.so.10.1 => /usr/local/cuda/lib64/libcudart.so.10.1 (0x00007f22dcfbd000)
        libswresample.so.3 => /home/wanggao/software/FFmpeg-n4.0.2/install/lib/libswresample.so.3 (0x00007f22dcda3000)
        liblzma.so.5 => /lib/x86_64-linux-gnu/liblzma.so.5 (0x00007f22dcb81000)
        libx264.so.148 => /usr/lib/x86_64-linux-gnu/libx264.so.148 (0x00007f22dc7dd000)
        libbz2.so.1.0 => /lib/x86_64-linux-gnu/libbz2.so.1.0 (0x00007f22dc5cd000)
        libjbig.so.0 => /usr/lib/x86_64-linux-gnu/libjbig.so.0 (0x00007f22dc3bf000)

Original: https://blog.csdn.net/wanggao_1990/article/details/124555285
Author: wanggao90
Title: opencv编译指定自定义的ffmpeg版本,cuda加速

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/703811/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球