MacOS(M1)交叉编译安卓版本OpenCV(附带FFmpeg)

7 篇文章 0 订阅
3 篇文章 0 订阅

1 编译FFmpeg

1.1 准备FFmpeg源码

git clone https://gitee.com/mirrors/ffmpeg.git

git checkout -b v4.2 origin/release/4.2 #切换到4.2分之,最新的不能适配opencv




1.2 构建编译脚本

在源码目录构建如下脚本文件,并执行

#!/bin/bash

#你的NDK路径
NDK=/Users/gauss/Library/Android/sdk/ndk/21.4.7075529
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/darwin-x86_64
API=21

echo "进入FFmpeg编译脚本"

function build_android
{
echo "Compiling FFmpeg for $CPU"
./configure \
    --prefix=$PREFIX \
    --libdir=$LIB_DIR \
    --enable-shared \
    --disable-static \
    --enable-jni \
    --disable-doc \
    --disable-symver \
    --disable-programs \
    --target-os=android \
    --arch=$ARCH \
    --cpu=$CPU \
    --cc=$CC \
    --cxx=$CXX \
    --enable-cross-compile \
    --sysroot=$SYSROOT \
    --extra-cflags="-Os -fpic $OPTIMIZE_CFLAGS" \
    --extra-ldflags="$ADDI_LDFLAGS" \
    --disable-asm \
    $COMMON_FF_CFG_FLAGS
make clean
make -j8 # 这里是定义用几个CPU编译
make install
echo "The Compilation of FFmpeg for $CPU is completed"
}

#################### armv7-a ################################

  echo "开始编译FFmpeg(armeabi-v7a)"
  OUTPUT_FOLDER="armeabi-v7a"
  ARCH="arm"
  CPU="armv7-a"
  TOOL_CPU_NAME=armv7a
  TOOL_PREFIX="$TOOLCHAIN/bin/arm-linux-androideabi"

  CC="$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang"
  CXX="$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang++"
  SYSROOT="$NDK/toolchains/llvm/prebuilt/darwin-x86_64/sysroot"
  PREFIX="${PWD}/android/$OUTPUT_FOLDER"
  LIB_DIR="${PWD}/android/libs/$OUTPUT_FOLDER"
  OPTIMIZE_CFLAGS="-march=$CPU"
  build_android


#################### armv8-a ################################

 echo "开始编译FFmpeg(arm64-v8a)"
 OUTPUT_FOLDER="arm64-v8a"
 ARCH=arm64
 CPU="armv8-a"
 TOOL_CPU_NAME=aarch64
 TOOL_PREFIX="$TOOLCHAIN/bin/$TOOL_CPU_NAME-linux-android"

 CC="$TOOL_PREFIX$API-clang"
 CXX="$TOOL_PREFIX$API-clang++"
 SYSROOT="$NDK/toolchains/llvm/prebuilt/darwin-x86_64/sysroot"
 PREFIX="${PWD}/android/$OUTPUT_FOLDER"
 LIB_DIR="${PWD}/android/libs/$OUTPUT_FOLDER"
 OPTIMIZE_CFLAGS="-march=$CPU"
 build_android

#################### x86 ################################

# echo "开始编译FFmpeg(x86)"
# OUTPUT_FOLDER="x86"
# ARCH="x86"
# CPU="x86"
# TOOL_CPU_NAME="i686"
# TOOL_PREFIX="$TOOLCHAIN/bin/${TOOL_CPU_NAME}-linux-android"

# CC="$TOOL_PREFIX$API-clang"
# CXX="$TOOL_PREFIX$API-clang++"
# SYSROOT="$NDK/toolchains/llvm/prebuilt/darwin-x86_64/sysroot"
# PREFIX="${PWD}/android/$OUTPUT_FOLDER"
# LIB_DIR="${PWD}/android/libs/$OUTPUT_FOLDER"
# OPTIMIZE_CFLAGS="-march=i686 -mtune=intel -mssse3 -mfpmath=sse -m32"
# build_android

#################### x86_64 ################################

# echo "开始编译FFmpeg(x86_64)"
# OUTPUT_FOLDER="x86_64"
# ARCH="x86_64"
# CPU="x86-64"
# TOOL_CPU_NAME="x86_64"
# TOOL_PREFIX="$TOOLCHAIN/bin/${TOOL_CPU_NAME}-linux-android"

# CC="$TOOL_PREFIX$API-clang"
# CXX="$TOOL_PREFIX$API-clang++"
# SYSROOT="$NDK/toolchains/llvm/prebuilt/darwin-x86_64/sysroot"
# PREFIX="${PWD}/android/$OUTPUT_FOLDER"
# LIB_DIR="${PWD}/android/libs/$OUTPUT_FOLDER"
# OPTIMIZE_CFLAGS="-march=$CPU"
# build_android

编译好之后得到库文件

添加ffmpeg-config.cmake文件,内容如下(针对armv7)

set(ffmpeg_path "${CMAKE_CURRENT_LIST_DIR}")

message("ffmpeg_path: ${ffmpeg_path}")

set(FFMPEG_LIBDIR "/opt/code/ffmpeg/android/libs/armeabi-v7a")
set(FFMPEG_INCLUDE_DIRS "/opt/code/ffmpeg/android/armeabi-v7a/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
        )

# 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)

# library versions, 注意这几个变量,一定要设置为全局CACHE变量
set(FFMPEG_libavutil_VERSION 56.31.100 CACHE INTERNAL "FFMPEG_libavutil_VERSION") # info
set(FFMPEG_libavcodec_VERSION 58.54.100 CACHE INTERNAL "FFMPEG_libavcodec_VERSION") # info
set(FFMPEG_libavformat_VERSION 58.29.100 CACHE INTERNAL "FFMPEG_libavformat_VERSION") # info
set(FFMPEG_libavdevice_VERSION 58.8.100 CACHE INTERNAL "FFMPEG_libavdevice_VERSION") # info
set(FFMPEG_libavfilter_VERSION 7.57.100 CACHE INTERNAL "FFMPEG_libavfilter_VERSION") # info
set(FFMPEG_libswscale_VERSION 5.5.100 CACHE INTERNAL "FFMPEG_libswscale_VERSION") # info
set(FFMPEG_libswresample_VERSION 3.5.100 CACHE INTERNAL "FFMPEG_libswresample_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)

2 编译 OpenCV

2.1 准备OpenCV源码

 git clone https://gitee.com/code-github/opencv_opencv.git 

* 4.x f7ac724c5d Merge pull request #21531 from fengyuentau:add_3rdparty_mirrors

git branch -r
  origin/2.4
  origin/3.4
  origin/4.x
  origin/5.x
  origin/HEAD -> origin/4.x                #使用的是4.x分支
  origin/master
  origin/next

2.2 修改源码根目录下CMakeLists.txt

需要修改两个地方

 

 2.3 执行cmake

需要准备SDk和NDK的路径


cmake -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK/build/cmake/android.toolchain.cmake -DCMAKE_ANDROID_NDK=$ANDROID_NDK \
-DANDROID_NATIVE_API_LEVEL=android-21 \
-DCMAKE_BUILD_TYPE=Release  \
-DCMAKE_INSTALL_PREFIX=/opt/code/opencv-4.x/ \
-DBUILD_JAVA=OFF \
-DANDROID_SDK_TOOLS=$ANDROID_SDK/build-tools/29.0.2  \
-DBUILD_ANDROID_EXAMPLES=OFF \
-DCMAKE_EXPORT_COMPILE_COMMANDS=OFF \
-DBUILD_SHARED_LIBS=ON \
-DWITH_FFMPEG=ON \
-DBUILD_FAT_JAVA_LIB=OFF \
-DOPENCV_GENERATE_PKGCONFIG=ON \
-DOPENCV_FFMPEG_USE_FIND_PACKAGE=ON \
-DOPENCV_FFMPEG_SKIP_BUILD_CHECK=ON \
-DFFMPEG_DIR=/opt/code/ffmpeg/android/ ..

最后可以看到已经关联了FFmpeg

-- 
--   Video I/O:
--     FFMPEG:                      YES (find_package)
--       avcodec:                   YES (58.54.100)
--       avformat:                  YES (58.29.100)
--       avutil:                    YES (56.31.100)
--       swscale:                   YES (5.5.100)
--       avresample:                NO
-- 
--   Parallel framework:            pthreads
-- 
--   Trace:                         YES (with Intel ITT)
-- 
--   Other third-party libraries:
--     Custom HAL:                  YES (carotene (ver 0.0.1))
--     Protobuf:                    build (3.19.1)
-- 
--   Python (for build):            /opt/homebrew/bin/python3
-- 
--   Install to:                    /opt/code/opencv-4.x

2.4 执行编译

make -j10
make install

参考:

opencv+ffmpeg编译打包全解指南 - 知乎 (zhihu.com)  Android最简单的基于FFmpeg的例子(一)---编译FFmpeg类库 | binglingziyu的博客

Android交叉编译OpenCV+FFmpeg+x264的艰难历程_dreamgyf的博客-CSDN博客

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值