【已解决】opencv 交叉编译 ffmpeg选项始终为NO

这篇具有很好参考价值的文章主要介绍了【已解决】opencv 交叉编译 ffmpeg选项始终为NO。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、opencv 交叉编译没有 ffmpeg ,会导致视频打不开

在交叉编译时候,发现在 pc 端能用 opencv 打开的视频,但是在 rv1126 上打不开。在网上查了很久,原因可能是 交叉编译过程 ffmpeg 造成的。之前 ffmpeg 是直接用 apt 安装的,opencv 编译也是直接用 Cmake 命令行进行的。

网上特别推荐用命令行进行编译,但是本次交叉编译,我发现使用 CMake-gui 进行编译,能更好地找出错误,因为不管是警告还是错误,CMake-gui 都会用红字来表示。

解决opencv源代码编译找不到ffmpeg-CSDN博客

二、准备工作

创建一个目录:/opt/software,把 opencv4.5.5、x264、ffmpeg-4.x 都下载到该目录

再创建一个目录:/opt/out-arm,用作 x264、ffmpeg的安装目录

三、交叉编译x264

opencv交叉编译静态库,支持ffmpeg、libjpeg,实现取流及写入jpeg文件_交叉编译 生成静态库_程序员阿周的博客-CSDN博客

1、解压源码并且进入源码目录
2、编译动态库,目的是编译ffmpeg使用,命令如下:
#./configure --prefix=/opt/software/opencv --host=arm-linux --cross-prefix=arm-linux-gnueabihf- --disable-asm --enable-shared
#make -j6
#make install
3、编译静态库,目的是最后我们的应用程序链接使用,命令如下:
#./configure --prefix=/home/cxyazhou/work/opencv --host=arm-linux --cross-prefix=arm-linux-gnueabihf- --disable-asm
#make clean;make -j6
#make install

注意:静态库编译时,make install只会拷贝bin下的文件到install目录,所以这里需要手动拷贝头文件、静态库到install目录,基于上面已经编译了动态库,会自动拷贝头文件,这里我们只要拷贝静态库到install的lib目录就可以:

#cp libx264.a /opt/out-arm/lib/

四、交叉编译 ffmpeg

opencv交叉编译静态库,支持ffmpeg、libjpeg,实现取流及写入jpeg文件_交叉编译 生成静态库_程序员阿周的博客-CSDN博客

0、配置下环境变量,防止编译 ffmpeg 时候找不到 x264库

ffmpeg 编译问题记录-CSDN博客

#export PKG_CONFIG_PATH=/opt/out_arm/lib/pkgconfig/

1、解压源码并且进入源码目录
2、编译静态库,命令如下:
#./configure --cross-prefix=arm-linux-gnueabihf- --enable-cross-compile --target-os=linux --cc=arm-linux-gnueabihf-gcc --arch=arm64 --prefix=/opt/out-arm --enable-ffmpeg --disable-armv5te --disable-armv6 --disable-armv6t2 --disable-asm --enable-swscale --enable-avresample --enable-gpl --enable-libx264 --extra-cflags=-I/opt/out-arm/include --extra-ldflags=-L/opt/out-arm/lib
#make -j6
#make install

五、交叉编译 OpenCV

opencv交叉编译包含ffmpeg_交叉编译 opencv ffmepg_思而后行之的博客-CSDN博客

Configure 前工作

按照上述块引用中的博客来,另外我还通过 Add Entry 指定了安装目录:

docker 容器中 /mnt 目录 会映射整个开发板

opencv编译没有ffmpeg,# 目标检测 模型部署,opencv,音视频,人工智能

Configure

Configure 过程中的一些 Warning 不用太在意,只要 Configure 能完成就行:

opencv编译没有ffmpeg,# 目标检测 模型部署,opencv,音视频,人工智能

检查 Configure 结果,FFMPEG 为 YES ,欧耶:

opencv编译没有ffmpeg,# 目标检测 模型部署,opencv,音视频,人工智能

Generate

Generate 在上面的博客中没有报错,但是我这里报错:

CMake Error in modules/videoio/CMakeLists.txt:
  Imported target "ocv.3rdparty.ffmpeg" includes non-existent path

    "/mnt/opt/software/opencv/include"

  in its INTERFACE_INCLUDE_DIRECTORIES.  Possible reasons include:

  * The path was deleted, renamed, or moved to another location.

  * An install or uninstall procedure did not complete successfully.

  * The installation package was faulty and references files it does not
  provide.

解决方法是把 x264、 ffmpeg库的安装目录下的 include 文件夹的内容 copy 过去

# copy /opt/out-arm/include/*     /mnt/opt/software/opencv/include -r

在构建目录下执行的工作

Generate 完成后,关闭 cmkae-gui,回到构建目录,执行:

# make -j8

# make install

安装完毕:

opencv编译没有ffmpeg,# 目标检测 模型部署,opencv,音视频,人工智能

六、检查是否能打开视频

CMakLists.txt

cmake_minimum_required(VERSION 2.8.4)

STRING(REGEX REPLACE ".*/(.*)" "\\1" CURRENT_FOLDER ${CMAKE_CURRENT_SOURCE_DIR} )
MESSAGE("current project: " ${CURRENT_FOLDER})

set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_CROSSCOMPILING TRUE)

cmake_host_system_information(RESULT arch_value QUERY OS_PLATFORM)

if(NOT "${arch_value}" STREQUAL "armv7l")
   include ($ENV{HOME}/configs/cross.cmake)
endif()

project(video_test)

# 设置链接器路径
link_directories(/mnt/usr/lib/arm-linux-gnueabihf)

set(CMAKE_PREFIX_PATH "/mnt/usr" ${CMAKE_PREFIX_PATH})
find_package(OpenCV REQUIRED)



add_executable(video_test test.cpp )


target_include_directories(video_test PUBLIC ${OpenCV_INCLUDE_DIRS} )
target_link_libraries(video_test  PRIVATE ${OpenCV_LIBS} /mnt/usr/lib/ogdi/libgdal.so)

target_link_libraries(video_test PRIVATE -Wl,-rpath,/mnt/usr/lib/arm-linux-gnueabihf/)

test.cpp

#include <opencv2/opencv.hpp>
#include <iostream>
int main()
{
    cv::VideoWriter outputVideo("/userdata/result.mp4",
                                cv::VideoWriter::fourcc('m', 'p', '4', 'v'),
                                double(1000/30),
                                cv::Size(640,480));


//    int camera_id =0;


    std::string video_path = "/userdata/test.avi";
    cv::VideoCapture camera(video_path);
    if(!camera.isOpened()){
        printf("camera %s cann't open\n", video_path.c_str());
        return 1;
    }
    else
        printf("camra %s opened\n", video_path.c_str());

    int frame_num = camera.get(cv::CAP_PROP_FRAME_COUNT);

    int frame=0;
    cv::Mat img;
    while(1){
        frame +=1;
        camera >> img;
        if (img.empty()){
            printf("camera cann't get image!\n");
        }

//        cv::imshow("result", img);
        outputVideo.write(img);
        if(frame == frame_num - 2) break;
    }

    camera.release();
    outputVideo.release();


    return 0;
}

交叉编译的可执行文件,video_test 可以在开发板上打开视频文件:

opencv编译没有ffmpeg,# 目标检测 模型部署,opencv,音视频,人工智能

七、其他

在编译和安装源代码时,常常会使用 pkg-config 工具来帮助 CMake 在构建过程中找到所需的库和头文件路径。pkg-config 是一个用于管理编译时和运行时依赖关系的工具,它提供了一个标准的接口来查询所需库的相关信息。

当安装一个库时,通常会将库的元数据信息(如库路径、版本号、依赖关系等)保存在对应的 .pc 文件中,并将该文件安装到系统的 pkg-config 目录中。pkg-config 目录是一个包含所有项目所需的 .pc 文件的目录,CMake 可以通过查询这些文件来获取库的信息。

在 CMake 中,可以使用 find_package 命令来查找并配置依赖库的设置。当传递库的名称给 find_package ,CMake 将通过 pkg-config 查询相应的库信息,并将结果存储在变量中,例如:

find_package(OpenCV REQUIRED)

上述代码中,find_package(OpenCV REQUIRED) 将在 pkg-config 目录中查找名为 opencv.pc 的文件,并从中提取出 OpenCV 库的信息,包括库的路径、版本号和所需的其他依赖关系。然后,CMake 将使用这些信息来配置 OpenCV 库的设置,以便在构建过程中可以找到和链接 OpenCV。

需要注意的是,并非所有的库都使用 pkg-config 进行管理和配置。有些库可能使用其他方式来提供编译和运行时的元数据信息,例如 CMake 配置文件或环境变量。因此,在使用特定库时,应查阅该库的文档或官方指南,以了解正确的配置方法。文章来源地址https://www.toymoban.com/news/detail-778507.html

到了这里,关于【已解决】opencv 交叉编译 ffmpeg选项始终为NO的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android ffmpeg入门(1)—— 使用NDK交叉编译ffmpeg集成到Android项目

    最近在学习android NDK开发相关内容,借ffmpeg练练手。ffmpeg是做音视频方面功能的基础,后面会随着个人的学习更新一系列ffmpeg博客,防止自己遗忘。 这个系列博客主要目的是基于ffmpeg通过NDK开发的方式完成一个基本的视频播放器。 本篇博客主要实现了 ffmpeg编译 以及 引入 a

    2023年04月08日
    浏览(44)
  • linux NDK交叉编译rtmp 与 ffmpeg+rtmp交叉编译(v7a,v8a) 完成流程

    最近在学RTMP,记录一下完成的编译流程 我是mac 电脑,但是mac上编译一直通过不了,后来才换到服务器上编译, 其实mac也能编译,只是最开始踩到坑里面了… 这里记录一下linux编译完整流程 环境: NDK: android-ndk-r17c Ffmpeg: ffmpeg4.2.2 (高版本也可以编译) system: mac 首先下载 rtmp https://gith

    2024年02月15日
    浏览(48)
  • android ndk clang交叉编译ffmpeg动态库踩坑

    1.ffmpeg默认使用gcc编译,在android上无法使用,否则各种报错,所以要用ndk的clang编译 2.下载ffmpeg源码 修改configure文件,增加命令 cross_prefix_clang 修改以下命令 修改后 3.新建脚本文件,ffmpeg目录下执行脚本文件即可。 编译32位,则ARCH改为arm,CPU改为armv7-a,TARGET改为armv7a-linux-

    2024年02月13日
    浏览(48)
  • FFmpeg开发笔记(十六)Linux交叉编译Android的OpenSSL库

    ​ 《FFmpeg开发实战:从零基础到短视频上线》一书的例程主要测试本地的音视频文件,当然为了安全起见,很多网络视频都采用了https地址。FFmpeg若要访问https视频,就必须集成第三方的openssl库,但编译FFmpeg时却默认关闭了openssl。为了让App能够播放采用https的在线视频,需要

    2024年04月22日
    浏览(40)
  • FFmpeg开发笔记(九)Linux交叉编译Android的x265库

    ​ 《FFmpeg开发实战:从零基础到短视频上线》一书的“12.1.2  交叉编译Android需要的so库”介绍了如何在Windows环境交叉编译Android所需FFmpeg的so库,前文又介绍了如何在Linux环境交叉编译Android所需FFmpeg的so库,接下来介绍如何在Linux环境交叉编译Android所需x265的so库。 执行以下命

    2024年04月08日
    浏览(72)
  • 编译opencv-3.4.5 [交叉编译]

    在unbuntu20.04环境下编译opencv3.4.5, cmake 版本:3.27.4 gcc 版本:11.4.0 g++版本:11.4.0 在此环境下编译opencv4.5.4正常。 1. 编译时遇到的问题 (1) Built target libprotobuf make: *** [Makefile:163:all] 错误 2 make时用suod:     sudo make -j4 (2) [ 30%] Linking CXX static library ../../lib/libopencv_core.a [ 30

    2024年02月07日
    浏览(38)
  • OPENCV 编译选项以及解释

    cmake编译以及模块介绍,后面遇到没有的会继续再补充 CMAKE_BUILD_TYPE:指定构建类型,如Debug、Release等。 CMAKE_INSTALL_PREFIX:指定安装目录。 BUILD_SHARED_LIBS:设置为ON时,构建共享库;设置为OFF时,构建静态库。 BUILD_WITH_STATIC_CTR:当为ON是,构建静态运行时库(MT/MTd),设置为

    2024年02月06日
    浏览(37)
  • opencv常用编译选项

    每个模块都是该modules目录的一个子目录。可以禁用一个模块: 相反的选项是只构建指定的模块和它们依赖的所有模块: 在此示例中,我们请求了 3 个模块,配置脚本已自动确定所有依赖项: 配置脚本可以尝试从互联网上下载额外的库和文件,如果失败,相应的功能将被关闭

    2024年02月13日
    浏览(81)
  • 交叉编译之opencv-4.1.1

    编译环境:ubuntu 22.04;编译工具CMake   opencv-4.1.1:https://github.com/opencv/opencv/archive/4.1.1.zip   opencv_contrib-4.1.1:https://github.com/opencv/opencv_contrib/archive/refs/tags/4.1.1.tar.gz   安装cmake ubuntu环境下,编辑~/.bashrc文件: 在最后添加交叉编译工具链: Operating System一定要设置为Linux!!!不然

    2024年03月21日
    浏览(40)
  • maven编译始终提示无效的目标发行版的解决方法

    1:确保IDE中的编译版本正确 在idea中,主要看项目属性中和setting的java compiler中对应的jdk版本是否正确,如下: 项目属性中查看: setting中查看: 2:确保pom文件中的maven-compiler-plugin插件配置正确 org.apache.maven.plugins maven-compiler-plugin 3.1 1.9 1.9 3:如果mvn compile编译提示如下异常信

    2024年02月13日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包