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/
转载文章受原作者版权保护。转载请注明原作者出处!