質問が出されてから何年も経ちますが、最近、この質問で説明されているような問題に遭遇しました!私の入力を追加したいと思います。
最初に:私は静的 ffmpeg ライブラリのみをビルドしました (理由により)。これは、opencv ビルド プロセスがやや敵対的です。静的 ffmpeg ライブラリに対する opencv ビルドをサポートしていないという opencv 開発者による投稿がありましたが、私の考えでは、「静的な opencv ライブラリもビルドしているとしたらどうでしょうか? それは確かにサポートされるべきではないでしょうか?」というものでした。
答えはイエスです 、静的 ffmpeg ライブラリに対して静的 opencv ライブラリをコンパイルできます! ffmpeg 4.2に対してopencv 4.1.1でこれを行いました。次の cmake オプションを使用する必要がありました:
cmake3 \
-D BUILD_opencv_apps=OFF \
-D BUILD_opencv_python2=OFF \
-D BUILD_SHARED_LIBS=OFF \
-D WITH_FFMPEG=ON \
-D OPENCV_FFMPEG_SKIP_BUILD_CHECK=ON \
これらのオプションは、PKG_CONFIG_PATH がそれらのライブラリを正しく見つけるように設定されている (または、それらをデフォルトのシステムの場所にインストールした場合) と仮定して、ビルドした ffmpeg 静的ライブラリを含む一連の opencv 静的ライブラリになります。
Q/A:
- アプリを作成できないのはなぜですか?
- opencv のビルド プロセスでは、静的ライブラリのみをビルドする場合でも、共有ライブラリをビルドおよびリンクしていると見なされます。これは、技術的な制限ではなく、ビルド プロセスの欠点のようです。おそらくいつの日か、これは修正されるでしょう。
- OPENCV_FFMPEG_SKIP_BUILD_CHECK フラグとは?
- ffmpeg の cmake プロセスには、opencv の他のアプリケーションと同じ欠陥のあるビルド プロセスを使用してアプリケーションがビルドおよびリンクされるステップがあります。必要のないときに共有ライブラリにリンクしているとプロセスが想定しているという意味で、これは誤りです。同じビルド手順を自分で実行できます その仮定を行い、実用的なアプリケーションを作成します。したがって、opencv が「はい」を受け入れるためには、このビルド チェックをオフにする必要があります。これは
- では、なぜ Python のサポートを無効にするのですか?
- opencv python ビルド プロセスは、Python でロード可能な共有ライブラリを明示的に生成します。
- これは、静的ライブラリを使用してもまだテスト スイートを構築していることを意味しますか?
- はい。しかし、私はそれらを実行しようとはしていません
のようなもの
export LD_LIBRARY_PATH=/ffmpeg_install_path/lib/
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/ffmpeg_install_path/lib/pkgconfig
export PKG_CONFIG_LIBDIR=$PKG_CONFIG_LIBDIR:/ffmpeg_install_path/lib/
動作するはずです。少なくとも、私の Ubuntu では OpenCV 2.4.x で動作します。
OpenCV 3.x と ffmpeg 3.x の場合、次のパッチを適用する必要があります
diff --git a/cmake/OpenCVFindLibsVideo.cmake b/cmake/OpenCVFindLibsVideo.cmake
index 13b62ac..bab9df3 100644
--- a/cmake/OpenCVFindLibsVideo.cmake
+++ b/cmake/OpenCVFindLibsVideo.cmake
@@ -228,6 +228,12 @@ if(WITH_FFMPEG)
if(FFMPEG_libavresample_FOUND)
ocv_append_build_options(FFMPEG FFMPEG_libavresample)
endif()
+ CHECK_MODULE(libavcodec HAVE_FFMPEG)
+ CHECK_MODULE(libavformat HAVE_FFMPEG)
+ CHECK_MODULE(libavutil HAVE_FFMPEG)
+ CHECK_MODULE(libswscale HAVE_FFMPEG)
+ CHECK_MODULE(libswresample HAVE_FFMPEG)
+ CHECK_MODULE(libavresample HAVE_FFMPEG)
if(HAVE_FFMPEG)
try_compile(__VALID_FFMPEG
"${OpenCV_BINARY_DIR}"
そして、ビルドする次のスクリプトで
#!/bin/bash
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$HOME/Applications/ffmpeg/lib
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:$HOME/Applications/ffmpeg/lib/pkgconfig
export PKG_CONFIG_LIBDIR=$PKG_CONFIG_LIBDIR:$HOME/Applications/ffmpeg/lib
cmake \
-D BUILD_EXAMPLES=ON \
-D BUILD_TESTS=OFF \
-D OPENCV_EXTRA_EXE_LINKER_FLAGS="-Wl,-rpath,$HOME/Applications/ffmpeg/lib" \
-D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=$HOME/Applications/opencv \
/path/to/opencv
また、ffmpeg をビルドするときに、フラグ --enable-avresample
を有効にする必要があります。 .