14

我似乎无法将 OpenCV 配置为链接到一组非/usr/libFFMPEG库。

我的 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 的系统库 - 这会导致冲突,因为系统库的版本是 0.52,而我安装的版本FFMPEG是 0.53。因此,在没有相同系统库的机器上链接应用程序似乎不会链接到我自定义安装的 OpenCV(特别是 libavcodec)(我将这些库安装在共享网络文件夹上)。

我不确定我的问题是与构建和链接到错误版本的 FFMPEG 还是在构建后与我的环境有关(然后链接到错误的 ffmpeg)。

我正在 Linux、Redhat 6、OpenCV 2.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 上的 OpenCV 2.4.x。

于 2012-09-14T20:56:16.510 回答
3

对于 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 时,我必须启用 flags --enable-avresample

于 2017-04-04T01:40:47.633 回答
2

问这个问题已经有好几年了,但我最近遇到了这个问题中描述的各种问题!我想添加我的输入。

首先:我只构建了静态 ffmpeg 库(出于某种原因),opencv 构建过程对此有些敌意。opencv 开发人员有帖子说他们不支持针对静态 ffmpeg 库的 opencv 构建,但我的想法是“如果您也在构建静态 opencv 库怎么办?当然应该支持?”

答案是肯定的,你可以针对静态 ffmpeg 库编译静态 opencv 库!我用opencv 4.1.1对ffmpeg 4.2做到了这一点。我不得不使用以下 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 \

这些选项会产生一组 opencv 静态库,其中包括您还构建的任何 ffmpeg 静态库,假设您的 PKG_CONFIG_PATH 设置为正确找到这些库(或者如果您已将它们安装到某个默认系统位置)。

问/答:

  • 为什么我们不能构建应用程序?
    • 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 库路径(尽管它确实设置了包含目录。)我的解决方法是为这些路径提供以下 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 库二进制文件的路径。有必要使用 -rpath-link 选项,因为构建系统没有为我的 ffmpeg 安装提供所有必要的 ffmpeg 库参数。

检查 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 回答