14

FFMPEG/ usr/lib以外のライブラリセットにリンクするようにOpenCVを構成できないようです。

私のLD_LIBRARY_PATHには、FFMPEGのカスタムインストール用のフォルダーへの直接リンクが含まれています。

LD_LIBRARY_PATH=/pathto/ffmpeg-0.10.2/lib

さらに、私はpkgconfigを次のように構成しました:

PKG_CONFIG_PATH=/samepathto/ffmpeg-0.10.2/lib/pkgconfig/

しかし、CMake内では、FFMPEGへのパスの設定が見つかりません-基本またはカスタムのいずれかです。FFMPEGに関連する唯一の設定はWITH_FFMPEGタイプ設定(ONに設定)であるように見えます。

OpenCVをビルドできますが、libavcodecのシステムライブラリにリンクしているようです。システムライブラリのバージョンが.52で、インストール中のバージョンFFMPEGが.53であるため、競合が発生します。同じシステムライブラリのないマシンにアプリをリンクすると、OpenCVのカスタムインストール(具体的にはlibavcodec)にリンクされないようです(これらのライブラリを共有ネットワークフォルダーにインストールしています)。

私の問題がFFMPEGの間違ったバージョンのビルドとリンクにあるのか、それともビルド後の私の環境にあるのか(そして間違ったffmpegにリンクするのか)はわかりません。

Linux、Redhat 6、OpenCV2.3.1でビルドしています。

4

4 に答える 4

20

何かのようなもの

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のOpenCV2.4.xでは動作します。

于 2012-09-14T20:56:16.510 に答える
3

OpenCV3.xとffmpeg3.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ます。

于 2017-04-04T01:40:47.633 に答える
2

質問されてから何年も経ちますが、最近、この質問で説明されているような問題に遭遇しました。入力を追加したいのですが。

まず、静的ffmpegライブラリのみをビルドしました(理由により)。これは、opencvビルドプロセスに対してやや敵対的です。opencv開発者による、静的ffmpegライブラリに対するopencvビルドをサポートしていないという投稿がありますが、私の考えは、「静的opencvライブラリもビルドしている場合はどうなるでしょうか?確かにサポートする必要がありますか?」

そして答えはイエスです、あなたは静的なffmpegライブラリに対して静的なopencvライブラリをコンパイルすることができます!私はffmpeg4.2に対してopencv4.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によってロード可能な共有ライブラリを明示的に生成します。
  • これは、静的ライブラリを使用してもテストスイートを構築していることを意味しますか?
    • はい。しかし、私はそれらを実行しようとしませんでした
于 2019-08-27T03:12:11.797 に答える
0

アンドレイの答えに加えて:

(私の構成では)opencv 4.1.1ビルドシステムがffmpegライブラリパスを正しく追加しなかったことがわかりました(ただし、includeディレクトリは設定されていました)。回避策は、これらのパスに次のcmakeビルド引数を指定することでした。

-DCMAKE_SHARED_LINKER_FLAGS=" -Wl,-rpath-link $FFMPEG_LIBDIR -L$FFMPEG_LIBDIR"
-DCMAKE_MODULE_LINKER_FLAGS=" -Wl,-rpath-link $FFMPEG_LIBDIR -L$FFMPEG_LIBDIR"
-DCMAKE_EXE_LINKER_FLAGS=" -Wl,-rpath-link $FFMPEG_LIBDIR -L$FFMPEG_LIBDIR"

ここで、$ FFMPEG_LIBDIRは、ffmpegライブラリバイナリへのパスです。ビルドシステムが私のffmpegインストールに必要なすべてのffmpegライブラリ引数を提供しなかったため、-rpath-linkotpionを使用する必要がありました。

modules / videoio / cmake / detect_ffmpeg.cmakeを調べると、FFMPEGは、次のように指定することで、ユーザーが指定したライブラリパスを受け入れるように強制することもできるようです。

-DHAVE_FFMPEG=ON
-DFFMPEG_INCLUDE_DIRS=(path to your ffmpeg include directories)
-DFFMPEG_LIBRARIES=(list of ffmpeg libraries, e.g. -lavcodec)

しかし、この方法を実行すると、ビルドシステムはFFMPEGには「YES」を表示しますが、個々のモジュールには「NO」を表示します(これ以上デバッグしませんでした)。

一部のユーザーは、リンカーフラグで--sysrootリンカー引数を指定するか、ビルド引数として-DCMAKE_SYSROOTを指定する必要があることに気付くでしょう。

これが誰かに役立つことを願っています:)

于 2020-02-28T00:34:54.227 に答える