OpenCV3をFFmpegとリンクさせてソースビルドしたい
解決したいこと
OpenCVをソースビルドする際に、FFmpegのGPL汚染を避けるためOpenH264とリンクしたLGPLのFFmpegとリンクさせようとしています。この際、OpenCV4系ではビルドが成功しますが、OpenCV3系では同じ手順で実行してもcmakeでエラーが発生してしまいます。
OpenCV3系のcmake時に自前でビルドしたFFmpegを認識させるためにはどうしたらよいでしょうか?
バージョン
- Ubuntu 20.04
- OpenCV 3.4.9 / 4.6.0
- FFmpeg 4.3.5
- Python 3.8.10
- gcc 9.4.0
- cmake 3.16.3
OpenCV4でうまくいくときの手順
関連パッケージのインストール
sudo apt install gcc g++ make cmake git nasm python3-venv libpython3.8-dev
OpenH264のビルドインストール
cd ~
git clone -b v2.3.1 https://github.com/cisco/openh264
cd openh264
make -j4
sudo make install
ls /usr/local/lib
# libopenh264.a libopenh264.so libopenh264.so.2.3.1 libopenh264.so.7 pkgconfig python3.8
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
ls ${PKG_CONFIG_PATH}
# openh264.pc
FFmpegビルドインストール
cd ~
git clone -b n4.3.5 https://github.com/FFmpeg/FFmpeg ffmpeg-n4.3.5
cd ffmpeg-n4.3.5
./configure \
--enable-libopenh264 \
--enable-optimizations \
--enable-static \
--enable-version3 \
--enable-shared \
--disable-gpl \
--disable-logging \
--disable-doc \
--disable-htmlpages \
--disable-manpages \
--disable-podpages \
--disable-txtpages \
--disable-avdevice \
--disable-postproc \
--disable-bzlib \
--disable-iconv \
--disable-cuda \
--disable-cuvid \
--disable-debug \
--extra-ldflags="-static-libgcc -static-libstdc++"
make -j4
sudo make install
sudo ldconfig
ffmpeg -version
# ffmpeg version n4.3.5 Copyright (c) 2000-2022 the FFmpeg developers
# built with gcc 9 (Ubuntu 9.4.0-1ubuntu1~20.04.1)
# (略)
ls ${PKG_CONFIG_PATH}
# libavcodec.pc libavfilter.pc libavformat.pc libavutil.pc libswresample.pc libswscale.pc openh264.pc
Pythonのvenv作成(動作確認目的でPythonを利用/ビルドするだけなら不要)
cd ~
python3 -m venv venv
source venv/bin/activate
pip install numpy==1.18.5
OpenCV4ビルドインストール
cd ~
wget https://github.com/opencv/opencv/archive/4.6.0.zip -O opencv-4.6.0.zip
unzip opencv-4.6.0.zip
cd opencv-4.6.0
mkdir build
cd build
export INSTALL_DIR=/home/vboxuser/opencv4
cmake \
-DCMAKE_BUILD_TYPE=RELEASE \
-DCMAKE_INSTALL_PREFIX=${INSTALL_DIR}/build \
-DOPENCV_PYTHON_INSTALL_PATH=${INSTALL_DIR} \
-DHAVE_opencv_python2=OFF \
-DHAVE_opencv_python3=ON \
-DBUILD_opencv_python2=OFF \
-DBUILD_opencv_python3=ON \
-DPYTHON3_EXECUTABLE=$(which python) \
-DPYTHON_DEFAULT_EXECUTABLE=$(which python) \
-DPYTHON3_INCLUDE_DIR=$(python -c "from distutils.sysconfig import get_python_inc; print(get_python_inc())") \
-DPYTHON3_PACKAGES_PATH=$(python -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())") \
-DOPENCV_FFMPEG_USE_FIND_PACKAGE=ON \
-DBUILD_DOCS=OFF \
-DBUILD_TESTS=OFF \
-DBUILD_EXAMPLES=OFF \
-DBUILD_JAVA=OFF \
-DWITH_1394=OFF \
-DWITH_CUDA=OFF \
-DWITH_CUFFT=OFF \
-DWITH_FFMPEG=ON \
-DWITH_GSTREAMERE=OFF \
-DWITH_GTK=OFF \
-DWITH_IPP=OFF \
-DWITH_JASPERE=OFF \
-DWITH_JPEG=ON \
-DWITH_OPENEXR=OFF \
-DWITH_PNG=ON \
-DWITH_TIFF=ON \
-DWITH_V4L=OFF \
-DWITH_GPHOTO2=OFF \
-DWITH_CUBLAS=OFF \
-DWITH_VTK=OFF \
-DWITH_NVCUVID=OFF \
..
# 以下のログが出力され、FFmpegを認識していることが確認できる
# -- Video I/O:
# -- FFMPEG: YES (find_package)
# -- avcodec: YES (58.91.100)
# -- avformat: YES (58.45.100)
# -- avutil: YES (56.51.100)
# -- swscale: YES (5.7.100)
# -- avresample: NO
# -- GStreamer: NO
make -j4
make install
echo ${INSTALL_DIR}/build/lib | sudo tee /etc/ld.so.conf.d/opencv.conf
sudo ldconfig
export PYTHONPATH=${INSTALL_DIR}/cv2/python-3.8
python -c "import cv2; cap = cv2.VideoCapture('bunny.mp4'); print(cap.isOpened())"
# True
OpenCV3でうまくいかないときの手順
※OpenCV3ビルドインストール直前まではOpenCV4までと共通
OpenCV3ビルドインストール
cd ~
wget https://github.com/opencv/opencv/archive/3.4.9.zip -O opencv-3.4.9.zip
unzip opencv-3.4.9.zip
cd opencv-3.4.9
mkdir build
cd build
export INSTALL_DIR=/home/vboxuser/opencv3
cmake \
-DCMAKE_BUILD_TYPE=RELEASE \
-DCMAKE_INSTALL_PREFIX=${INSTALL_DIR}/build \
-DOPENCV_PYTHON_INSTALL_PATH=${INSTALL_DIR} \
-DHAVE_opencv_python2=OFF \
-DHAVE_opencv_python3=ON \
-DBUILD_opencv_python2=OFF \
-DBUILD_opencv_python3=ON \
-DPYTHON3_EXECUTABLE=$(which python) \
-DPYTHON_DEFAULT_EXECUTABLE=$(which python) \
-DPYTHON3_INCLUDE_DIR=$(python -c "from distutils.sysconfig import get_python_inc; print(get_python_inc())") \
-DPYTHON3_PACKAGES_PATH=$(python -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())") \
-DOPENCV_FFMPEG_USE_FIND_PACKAGE=ON \
-DBUILD_DOCS=OFF \
-DBUILD_TESTS=OFF \
-DBUILD_EXAMPLES=OFF \
-DBUILD_JAVA=OFF \
-DWITH_1394=OFF \
-DWITH_CUDA=OFF \
-DWITH_CUFFT=OFF \
-DWITH_FFMPEG=ON \
-DWITH_GSTREAMERE=OFF \
-DWITH_GTK=OFF \
-DWITH_IPP=OFF \
-DWITH_JASPERE=OFF \
-DWITH_JPEG=ON \
-DWITH_OPENEXR=OFF \
-DWITH_PNG=ON \
-DWITH_TIFF=ON \
-DWITH_V4L=OFF \
-DWITH_GPHOTO2=OFF \
-DWITH_CUBLAS=OFF \
-DWITH_VTK=OFF \
-DWITH_NVCUVID=OFF \
..
# 以下のログが出力され、FFmpegを認識していないことが確認できる
# -- Video I/O:
# -- FFMPEG: NO (find_package)
# -- avcodec: NO
# -- avformat: NO
# -- avutil: NO
# -- swscale: NO
# -- avresample: NO
# -- GStreamer: NO
make -j4
make install
echo ${INSTALL_DIR}/build/lib | sudo tee /etc/ld.so.conf.d/opencv.conf
sudo ldconfig
export PYTHONPATH=${INSTALL_DIR}/cv2/python-3.8
python -c "import cv2; cap = cv2.VideoCapture('bunny.mp4'); print(cap.isOpened())"
# False
0