交叉编译x264 zlib ffmpeg以及OpenCV等 以及解决交叉编译OpenCV时ffmpeg始终为NO的问题

news2024/11/18 1:47:20

文章目录

  • 环境
  • 编译流程
      • nasm编译
      • x264编译
      • zlib编译
      • libJPEG编译
      • libPNG编译
      • libtiff编译
    • FFmpeg编译
    • OpenCV编译
    • 问题1
      • 解决方案
    • 问题2
      • 解决方案
    • 总结

环境

  • 系统:Ubutu 18.04
  • 交叉编译链:gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu 我的路径/opt/toolchain/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-gcc
  • OpenCV 3.4.16
  • FFmpeg n3.4.12
  • zlib 1.3.1
  • 好多包找不到哪里下的了备份在这里

编译流程

nasm编译

  • 下载源码并解压
  • mkdir build && cd build
  • ../configure --host=aarch64-linux --prefix=/home/lei/RK_Lib/nasm-lib --enable-shared CC=/opt/toolchain/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-gcc --disable-asm

x264编译

  • 下载源码并解压
  • mkdir build && cd build
  • ../configure --enable-shared --enable-static --disable-asm --prefix=/home/lei/RK_Lib/x264-lib --host=aarch64-linux --cross-prefix=/opt/toolchain/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu- --extra-libs=-ldl --disable-opencl

zlib编译

  • 下载源码并解压
  • mkdir build && cd build
  • ../configure --prefix=/home/lei/RK_Lib/zlib-lib
    修改makefile: 替换gcc为/opt/toolchain/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-gcc

libJPEG编译

  • 下载源码并解压
  • mkdir build && cd build
  • ../configure CC=/opt/toolchain/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-gcc --host=aarch64-linux --prefix=/home/lei/RK_Lib/JPEG-lib --enable-shared --enable-static

libPNG编译

  • 下载源码并解压
  • mkdir build && cd build
  • 将zlib 下的inlcue中的文件和lib中的文件拷贝交叉编译器下的目录/opt/toolchain/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/include lib
  • ../configure CC=/opt/toolchain/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-gcc --host=aarch64-linux --prefix=/home/lei/RK_Lib/PNG-lib --enable-shared --enable-static

libtiff编译

  • 下载源码并解压
  • mkdir build && cd build
  • ../configure CC=/opt/toolchain/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-gcc CXX=/opt/toolchain/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-g++ --host=arm-linux --prefix=/home/lei/RK_Lib/tiff-lib --enable-shared --enable-static

FFmpeg编译

  • 下载源码并解压
  • mkdir build && cd build
  • 创建/home/lei/RK_Lib/arm-lib/include 和 /home/lei/RK_Lib/arm-lib/lib并将x264和zlib编译出的include和lib复制进去
  • ../configure --enable-shared --enable-static --prefix=/home/lei/RK_Lib/ffmpeg-lib3 --cross-prefix=/opt/toolchain/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu- --arch=aarch64 --target-os=linux --enable-gpl --enable-ffmpeg --enable-libx264 --enable-zlib --enable-avresample --extra-cflags=-I/home/lei/RK_Lib/arm-lib/include --extra-ldflags=-L/home/lei/RK_Lib/arm-lib/lib

OpenCV编译

  • 下载源码并解压
  • mkdir build && cd build
  • 将编译出的FFmpeg的include和lib也复制到/home/lei/RK_Lib/arm-lib/include 和 /home/lei/RK_Lib/arm-lib/lib
  • /home/lei/RK_Lib/arm-lib目录下创建ffmpeg-config.cmake并编辑
set(ffmpeg_path "${CMAKE_CURRENT_LIST_DIR}")

message("ffmpeg_path: ${ffmpeg_path}")

set(FFMPEG_EXEC_DIR "${ffmpeg_path}/bin")
set(FFMPEG_LIBDIR "${ffmpeg_path}/lib")
set(FFMPEG_INCLUDE_DIRS "${ffmpeg_path}/include")

# library names
set(FFMPEG_LIBRARIES
    ${FFMPEG_LIBDIR}/libavformat.so
    ${FFMPEG_LIBDIR}/libavdevice.so
    ${FFMPEG_LIBDIR}/libavcodec.so
    ${FFMPEG_LIBDIR}/libavutil.so
    ${FFMPEG_LIBDIR}/libswscale.so
    ${FFMPEG_LIBDIR}/libswresample.so
    ${FFMPEG_LIBDIR}/libavfilter.so
    ${FFMPEG_LIBDIR}/libavresample.so
    ${FFMPEG_LIBDIR}/libz.so
    ${FFMPEG_LIBDIR}/libx264.so
)

# found status
set(FFMPEG_libavformat_FOUND TRUE)
set(FFMPEG_libavdevice_FOUND TRUE)
set(FFMPEG_libavcodec_FOUND TRUE)
set(FFMPEG_libavutil_FOUND TRUE)
set(FFMPEG_libswscale_FOUND TRUE)
set(FFMPEG_libswresample_FOUND TRUE)
set(FFMPEG_libavfilter_FOUND TRUE)
set(FFMPEG_libavresample_FOUND TRUE)

# library versions, 注意这几个变量,一定要设置为全局CACHE变量
set(FFMPEG_libavutil_VERSION 55.78.100 CACHE INTERNAL "FFMPEG_libavutil_VERSION") # info
set(FFMPEG_libavcodec_VERSION 57.107.100 CACHE INTERNAL "FFMPEG_libavcodec_VERSION") # info
set(FFMPEG_libavformat_VERSION 57.83.100 CACHE INTERNAL "FFMPEG_libavformat_VERSION") # info
set(FFMPEG_libavdevice_VERSION 57.10.100 CACHE INTERNAL "FFMPEG_libavdevice_VERSION") # info
set(FFMPEG_libavfilter_VERSION 6.107.100 CACHE INTERNAL "FFMPEG_libavfilter_VERSION") # info
set(FFMPEG_libswscale_VERSION 4.8.100 CACHE INTERNAL "FFMPEG_libswscale_VERSION") # info
set(FFMPEG_libswresample_VERSION 2.9.100 CACHE INTERNAL "FFMPEG_libswresample_VERSION") # info
set(FFMPEG_libavresample_VERSION 3.7.0 CACHE INTERNAL "FFMPEG_libavresample_VERSION") # info

set(FFMPEG_FOUND TRUE)
set(FFMPEG_LIBS ${FFMPEG_LIBRARIES})

status("    #################################### FFMPEG:"       FFMPEG_FOUND         THEN "YES (find_package)"                       ELSE "NO (find_package)")
status("      avcodec:"      FFMPEG_libavcodec_VERSION    THEN "YES (${FFMPEG_libavcodec_VERSION})"    ELSE NO)
status("      avformat:"     FFMPEG_libavformat_VERSION   THEN "YES (${FFMPEG_libavformat_VERSION})"   ELSE NO)
status("      avutil:"       FFMPEG_libavutil_VERSION     THEN "YES (${FFMPEG_libavutil_VERSION})"     ELSE NO)
status("      swscale:"      FFMPEG_libswscale_VERSION    THEN "YES (${FFMPEG_libswscale_VERSION})"    ELSE NO)
status("      avresample:"   FFMPEG_libavresample_VERSION THEN "YES (${FFMPEG_libavresample_VERSION})" ELSE NO)

注意这里需要把zlib和x264的库文件也指定好

-进入opencv/build目录下,执行 vim toolchain.cmake并写入以下内容,具体路径自行指定:

set( CMAKE_SYSTEM_NAME Linux )
set( CMAKE_SYSTEM_PROCESSOR aarch64 )
set( CMAKE_C_COMPILER /opt/toolchain/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-gcc )
set( CMAKE_CXX_COMPILER /opt/toolchain/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-g++ )
set( CMAKE_FIND_ROOT_PATH "/home/lei/RK_Lib/arm-lib/lib" )
set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER )
set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY )
set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY )
  • 修改OpenCV的CMakeLists.txt
# opencv.hpp and legacy headers
link_directories(/home/lei/RK_Lib/arm-lib/lib)  # 添加这句
add_subdirectory(include)
  • 修改OpenCVFindLibsVideo.cmake把message(FATAL_ERROR "FFMPEG: test check build log:\n${TRY_OUT}")取消注释,以便查看FFmpeg编译输出信息

  • 终端执行

cmake -D CMAKE_TOOLCHAIN_FILE=toolchain.cmake \
 -D BUILD_opencv_python3=yes -D BUILD_opencv_python2=no -D PYTHON3_EXECUTABLE=/usr/bin/python3.6m -D PYTHON3_INCLUDE_DIR=/usr/include/python3.6m -D PYTHON3_LIBRARY=/usr/lib/x86_64-linux-gnu/libpython3.6m.so -D PYTHON3_PACKAGES_PATH=/usr/lib/python3/dist-packages -D PYTHON_DEFAULT_EXECUTABLE=/usr/bin/python3.6m \
 -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/home/lei/RK_Lib/opencv-lib \ 
 -D BUILD_ZLIB=ON -D BUILD_JPEG=ON -D BUILD_PNG=ON -D BUILD_TIFF=ON \
 -D ENABLE_CXX11=ON \
 -D WITH_FFMPEG=ON -D WITH_OPENCL=ON -D WITH_GTK=OFF -D WITH_OPENGL=ON -D WITH_ZLIB=ON -D WITH_OPENMP=ON -D WITH_PNG=ON \
 -D BUILD_SHARED_LIBS=OFF \
-D CMAKE_FIND_ROOT_PATH=/home/lei/RK_Lib/arm-lib \
-D BUILD_TESTS=ON \
-D FFMPEG_INCLUDE_DIRS=/home/lei/RK_Lib/arm-lib/include \
-D OPENCV_GENERATE_PKGCONFIG=ON \
-D OPENCV_FFMPEG_USE_FIND_PACKAGE=ON \
-D OPENCV_FFMPEG_SKIP_BUILD_CHECK=ON \
-D FFMPEG_DIR=/home/lei/RK_Lib/arm-lib \
..
  • 执行make -j8
  • 执行make install

问题1

执行config出现ffmpeg为NO:

解决方案

一开始确实遇到了这个问题,添加ffmpeg-config.cmake等文件后可以解决。

问题2

在这里插入图片描述>在这里插入图片描述

这里我没找到很好的解决方案,按照下面的方案解决需要重复修改link.txt文件若干次…慢慢来吧,这玩意确实需要耐心。

解决方案

比如进入path/opencv-3.4.16/build/modules/videoio/CMakeFiles/opencv_test_videoio.dir目录下修改link.txt,在/opt/toolchain/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-g++后面添加 -Wl,-rpath-link,/home/lei/RK_Lib/arm-lib/lib并保存重新执行make

反正就是找不到哪个库就-rpath到哪个库的文件夹

总结

交叉编译真麻烦…

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1509467.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

解释“RNN encode-decode”

“RNN encode-decode” 涉及使用循环神经网络(Recurrent Neural Network,RNN)来执行编码和解码操作。这种结构常用于处理序列数据,例如自然语言处理、语音识别和时间序列预测等任务。 以下是 “RNN encode-decode” 的一般概念&a…

week07day01(窗口函数)

一. 窗口函数的定义和一些规范: 对数据进行分区,数据的样式是不改变的,但是会多添加一列。窗口函数只能写在"结果集"中。 二. 排名函数 1. rank() over() 例题:对每个人的消费金额进行排名: rank() …

基于Android的教学课程系统设计与开发

摘 要 移动应用已经成为人们生活必不可缺的一部分,大学生身为移动应用的最大用户群体,在生活学习娱乐各个方面都与移动应用有着紧密联系,然而针对大学生校园学习的移动应用却寥寥无几,因为不同的学校,甚至不同的院系&…

unity显示当前时间

1建立文本组件和一个空对象 2创建一个脚本并复制下面代码 using System.Collections; using System.Collections.Generic; using TMPro; using UnityEngine;public class showtime: MonoBehaviour {public TextMeshProUGUI time;private void Update(){string currentTime Sy…

抖音开放平台第三方开发,实现代小程序备案申请

大家好,我是小悟 抖音小程序备案整体流程总共分为五个环节:备案信息填写、平台初审、工信部短信核验、通管局审核和备案成功。 服务商可以代小程序发起备案申请。在申请小程序备案之前,需要确保小程序基本信息已填写完成、小程序至少存在一个…

Clearview X for mac v3.5.0 电子书阅读器 兼容 M1/M2/M3

应用介绍 Clearview X 是 macOS 上的一款简洁易用且美观大方的电子书阅读器。直观好用的图书管理功能,支持 PDF, Epub, MOBI, CHM, FB2, CBR, CBZ 等流行的电子书格式,可以方便地添加注解,插入书签,及迅速的搜索查找。支持在不同…

基于Springboot的高校竞赛管理系统(有报告)。Javaee项目,springboot项目。

演示视频: 基于Springboot的高校竞赛管理系统(有报告)。Javaee项目,springboot项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构…

C#/WPF 清理任务栏托盘图标缓存

在我们开发Windows客户端程序时,往往会出现程序退出后,任务还保留之前程序的缓存图标。每打开关闭一次程序,图标会一直增加,导致托盘存放大量缓存图标。为了解决这个问题,我们可以通过下面的程序清理任务栏托盘图标缓存…

深度学习_AlexNet_2

目标 知道AlexNet网络结构能够利用AlexNet完成图像分类 2012年,AlexNet横空出世,该模型的名字源于论文第一作者的姓名Alex Krizhevsky 。AlexNet使用了8层卷积神经网络,以很大的优势赢得了ImageNet 2012图像识别挑战赛。它首次证明了学习到…

安卓studio安装(从安装到配置到helloworld)

安卓studio安装 2024.3.11官网的版本(有些翻墙步骤下载东西也解决了) 这次写的略有草率,后面会更新布局的,因为截图量太大了,有需要的小伙伴可以试着接受一下哈哈哈哈 !(https://gitee.com/jiuzheyangbawjf/img/raw/ma…

【webrtc】m122:BitrateProber 源码阅读与分析

pacing controller 需要 bitrate prober Pacing模块中存在一个BitrateProber prober_的成员变量,专门用来处理带宽探测 大神的分析也是基于最新版本webrtc的:ProbeController每次可能会生成多个探测源数据ProbeClusterConfig,其中每个源数据ProbeClusterConfig对应一个探测簇…

软件杯 垃圾邮件(短信)分类算法实现 机器学习 深度学习

文章目录 0 前言2 垃圾短信/邮件 分类算法 原理2.1 常用的分类器 - 贝叶斯分类器 3 数据集介绍4 数据预处理5 特征提取6 训练分类器7 综合测试结果8 其他模型方法9 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 垃圾邮件(短信)分类算…

C++Qt学习——Qt信号槽

信号和槽是Qt编程的基础,他们的存在使得在Qt中处理界面各个组件的交互操作变得更加直观简单。信号(SUGNAL):也就是发送者发送的函数信号,例如PushButtun最常见的信号就是鼠标单击的时候发射的click()信号槽&#xff08…

华为配置ISP选路实现报文按运营商转发

CLI举例:配置ISP选路实现报文按运营商转发 介绍通过配置ISP选路实现报文按运营商转发的配置举例。 组网需求 如图1所示,FW作为安全网关部署在网络出口,企业分别从ISP1和ISP2租用一条链路。 企业希望访问Server 1的报文从ISP1链路转发&#…

Python机器学习预测+回归全家桶,新增TCN,BiTCN,TCN-GRU,BiTCN-BiGRU等组合模型预测...

截止到本期,一共发了4篇关于机器学习预测全家桶Python代码的文章。参考往期文章如下: 1.机器学习预测全家桶-Python,一次性搞定多/单特征输入,多/单步预测!最强模板! 2.机器学习预测全家桶-Python&#xff…

el-table中 el-popover 性能优化

场景:在 el-table 中使用 el-popover ,出现了 loading 加载卡顿的问题,接口返回的数据的时间大概是 140ms ,所以不是接口慢的原因;通过对表中结构的逐步排查,发现是表中的 某一行 所影响的;并且 其中含有 e…

qt 汉字输出 中文输出 显示乱码 qDebug() 乱码 解决

要正确显示汉字,必须要先了解计算机文字编码相关知识,参考:unicode ucs2 utf16 utf8 ansi GBK GB2312 互转 及 渲染_ucs2编码转换-CSDN博客 1、汉字输出到 应用程序输出面板 qt 自定义的输出类qDebug() 、QDebug对象、QMessageLogger默认输…

单例模式及线程安全的实践

🌟 欢迎来到 我的博客! 🌈 💡 探索未知, 分享知识 !💫 本文目录 引言基本的单例模式长啥样?怎样才能线程安全?**懒汉模式** ( 双 重 检 查 ) 🎉总结🎉 引言 单例模式是个…

WebPack自动吐出脚本

window.c c; window.res ""; window.flag false;c function (r) {if (flag) {window.res window.res "${r.toString()}" ":" (e[r] "") ",";}return window.c(r); }代码改进了一下,可以过滤掉重复的方…

酷开科技发力研发酷开系统,让家庭娱乐生活更加丰富多彩

在这个快节奏的社会,家庭娱乐已成为我们日常生活中不可或缺的一部分,为了给家庭带来更多欢笑与感动,酷开科技发力研发出拥有丰富内容和技术的智能电视操作系统——酷开系统,它集合了电影、电视剧、综艺、游戏、音乐等海量内容&…