交叉编译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)
- 寻找“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
- 找到“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()
- 把下面紧跟的测试代码注释掉(如下)
#==================================
# 添加了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进行编译
- 通过“+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
- 点击Configure,选第三个选项cross-compile,然后选择
ndroid-ndk-r21/build/cmake/android.toolchain.cmake这个文件 - 点击Generate
- 进入源码文件夹,打开命令行,输入make install命令
本文详细介绍了如何在Ubuntu 18.04上交叉编译Android版的OpenCV 4.2.0,并集成ffmpeg 4.2.2。首先确保安装了必要的工具,然后编译ffmpeg,接着修改OpenCV的CMakeLists.txt和detect_ffmpeg.cmake文件,最后使用Cmake-GUI配置编译选项并生成Makefile,完成静态库的编译安装。
4157

被折叠的 条评论
为什么被折叠?



