交叉编译Android OpenCV with ffmpeg

本文详细介绍了如何在Ubuntu 18.04上交叉编译Android版的OpenCV 4.2.0,并集成ffmpeg 4.2.2。首先确保安装了必要的工具,然后编译ffmpeg,接着修改OpenCV的CMakeLists.txt和detect_ffmpeg.cmake文件,最后使用Cmake-GUI配置编译选项并生成Makefile,完成静态库的编译安装。

交叉编译Android OpenCV with ffmpeg

编译为静态库

环境

Ubuntu 18.04 64位
OpenCV 4.2.0
ffmpeg 4.2.2
android-ndk-21r

准备

系统配置好cmake,cmake-gui,build-essential等工具,能够运行make、make install命令

编译ffmpeg

进入ffmpeg的源代码目录,运行下列脚本:

#!/bin/bash
export TMPDIR=./temp

TOOLCHAIN=/home/lijiyu/android-ndk-r21/toolchains/llvm/prebuilt/linux-x86_64/
CPU=arm64-v8a
PREFIX=/home/lijiyu/ffmpeg-4.2.2/ffmpeg-android-static
CROSS_PREFIX=$TOOLCHAIN/bin/aarch64-linux-android-
CC=$TOOLCHAIN/bin/aarch64-linux-android27-clang
CXX=$TOOLCHAIN/bin/aarch64-linux-android27-clang++
 
./configure \
  --prefix=$PREFIX \
  --enable-avresample \
  --disable-shared \
  --enable-static \
  --disable-programs \
  --disable-doc \
  --disable-avdevice \
  --disable-postproc \
  --cross-prefix=$TOOLCHAIN/bin/aarch64-linux-android- \
  --cc=$TOOLCHAIN/bin/aarch64-linux-android27-clang \
  --cxx=$TOOLCHAIN/bin/aarch64-linux-android27-clang++ \
  --target-os=android \
  --arch=aarch64 \
  --enable-cross-compile \
  --sysroot=$TOOLCHAIN/sysroot

echo Configure process Finished!
make clean
echo Make clean process Finished!
make
echo Make process Finished!
echo Beginning make install
make install

编译OpenCV with ffmpeg

1. 修改文件:source/CmakeLists.txt

打开OpenCV源代码 opencv-4.2.0/CmakeLists.txt,找到以下内容:

OCV_OPTION(WITH_FFMPEG "Include FFMPEG support" (NOT ANDROID)
  VISIBLE_IF NOT IOS AND NOT WINRT
  VERIFY HAVE_FFMPEG)

改为:

OCV_OPTION(WITH_FFMPEG "Include FFMPEG support" ON
  VISIBLE_IF NOT IOS AND NOT WINRT
  VERIFY HAVE_FFMPEG)
  1. 寻找“find_package(PkgConfig QUIET)”这一条命令,将此命令复制一个放到外面,如下:
        message(WARNING "OPENCV_DISABLE_PKG_CONFIG flag has no effect")
      endif()
    else()
      find_package(PkgConfig QUIET)
    endif()
  endif()
  include(CheckFunctionExists)
  include(CheckIncludeFile)
  include(CheckSymbolExists)
  find_package(PkgConfig QUIET) # 使得此命令总会执行
  if(NOT APPLE)
修改文件 opencv-4.2.0/modules/videoio/cmake/detect_ffmpeg.cmake
  1. 找到“if(NOT HAVE_FFMPEG AND PKG_CONFIG_FOUND)”这个语句块,更改为如下:
if(NOT HAVE_FFMPEG AND PKG_CONFIG_FOUND)
  
  set(pkgcfg_lib_FFMPEG_avformat ${FFMPEG_LIB_DIR}/libavformat.a)
  set(pkgcfg_lib_FFMPEG_avcodec ${FFMPEG_LIB_DIR}/libavcodec.a)
  set(pkgcfg_lib_FFMPEG_avutil ${FFMPEG_LIB_DIR}/libavutil.a)
  set(pkgcfg_lib_FFMPEG_swscale ${FFMPEG_LIB_DIR}/libswscale.a)
  set(pkgcfg_lib_FFMPEG_swresample ${FFMPEG_LIB_DIR}/libswresample.a)
  # ocv_check_modules(FFMPEG libavcodec libavformat libavutil libswscale)
  ocv_check_modules(FFMPEG libavformat libavcodec libavutil libswscale libswresample)
  if(FFMPEG_FOUND)
    ocv_check_modules(FFMPEG_libavresample libavresample) # optional
    if(FFMPEG_libavresample_FOUND)
      list(APPEND FFMPEG_LIBRARIES ${FFMPEG_libavresample_LIBRARIES})
    endif()
    set(HAVE_FFMPEG TRUE)
  endif()
endif()
  1. 把下面紧跟的测试代码注释掉(如下)
#==================================
# 添加了False使得测试不会运行,总是通过
if(FALSE AND HAVE_FFMPEG AND NOT HAVE_FFMPEG_WRAPPER AND NOT OPENCV_FFMPEG_SKIP_BUILD_CHECK)
  try_compile(__VALID_FFMPEG
      "${OpenCV_BINARY_DIR}"
      "${OpenCV_SOURCE_DIR}/cmake/checks/ffmpeg_test.cpp"
      CMAKE_FLAGS "-DINCLUDE_DIRECTORIES:STRING=${FFMPEG_INCLUDE_DIRS}"
                  "-DLINK_LIBRARIES:STRING=${FFMPEG_LIBRARIES}"
      OUTPUT_VARIABLE TRY_OUT
  )
  if(NOT __VALID_FFMPEG)
    # message(FATAL_ERROR "FFMPEG: test check build log:\n${TRY_OUT}")
    message(STATUS "WARNING: Can't build ffmpeg test code")
    set(HAVE_FFMPEG FALSE)
  endif()
endif()

#==================================
使用Cmake-GUI进行编译
  1. 通过“+Add Entry”添加下列项:

ANDROID_ABI=arm64-v8a
ANDROID_PLATFORM=27
BUILD_ANDROID_PROJECTS=FALSE
BUILD_ANDROID_EXAMPLES=FALSE
PKG_CONFIG_PATH=编译生成的ffmpeg文件夹的lib/pkgconfig文件夹
BUILD_ZLIB=TRUE
WITH_FFMPEG=TRUE

  1. 点击Configure,选第三个选项cross-compile,然后选择 ndroid-ndk-r21/build/cmake/android.toolchain.cmake这个文件
  2. 点击Generate
  3. 进入源码文件夹,打开命令行,输入make install命令
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值