-
2018-04-21: update ffmpeg-4.0.
-
2018-11-16: update script.
-
2019-03-11: update script, add
armeabi
abi support. -
2019-04-03: update script, use
android-ndk-r15c
-
2019-04-25: update script, update ffmpeg to 4.0.4, add
build_ffmpeg.sh
-
2019-04-28: update script, update ffmpeg to 4.1.3, use
android-ndk-r17c
,armeabi
update toarmv6
. -
2020-03-15: Update script, update ffmpeg to 4.2.2, use
ndk 21
, removearmeabi
使用AndroidStudio 开发 FFmpeg
Keywords: gradle, cmake
关键步骤,编译FFmpeg,Android Studio 集成。abi support:
armeabi-v7a
arm64-v8a
x86
x86_64
ndk version:ndk 21
ffmpeg:4.2.2
第一步,编译ffmpeg
首先下载并解压
wget https://ffmpeg.org/releases/ffmpeg-4.2.2.tar.bz2 tar xvf ffmpeg-4.2.2.tar.bz2
然后编写编译脚本
#!/usr/bin/env bash NDK_PATH=/Android/Sdk/ndk/21.0.6113669 HOST_PLATFORM_WIN=windows-x86_64 HOST_PLATFORM=$HOST_PLATFORM_WIN API=29 TOOLCHAINS="$NDK_PATH/toolchains/llvm/prebuilt/$HOST_PLATFORM" SYSROOT="$NDK_PATH/toolchains/llvm/prebuilt/$HOST_PLATFORM/sysroot" CFLAG="-D__ANDROID_API__=$API -Os -fPIC -DANDROID " LDFLAG="-lc -lm -ldl -llog " PREFIX=android-build CONFIG_LOG_PATH=${PREFIX}/log COMMON_OPTIONS= CONFIGURATION= build() { APP_ABI=$1 echo "======== > Start build $APP_ABI" case ${APP_ABI} in armeabi-v7a) ARCH="arm" CPU="armv7-a" MARCH="armv7-a" TARGET=armv7a-linux-androideabi CC="$TOOLCHAINS/bin/$TARGET$API-clang" CXX="$TOOLCHAINS/bin/$TARGET$API-clang++" LD="$TOOLCHAINS/bin/$TARGET$API-clang" CROSS_PREFIX="$TOOLCHAINS/bin/arm-linux-androideabi-" EXTRA_CFLAGS="$CFLAG -mfloat-abi=softfp -mfpu=vfp -marm -march=$MARCH " EXTRA_LDFLAGS="$LDFLAG" EXTRA_OPTIONS="--enable-neon --cpu=$CPU " ;; arm64-v8a) ARCH="aarch64" TARGET=$ARCH-linux-android CC="$TOOLCHAINS/bin/$TARGET$API-clang" CXX="$TOOLCHAINS/bin/$TARGET$API-clang++" LD="$TOOLCHAINS/bin/$TARGET$API-clang" CROSS_PREFIX="$TOOLCHAINS/bin/$TARGET-" EXTRA_CFLAGS="$CFLAG" EXTRA_LDFLAGS="$LDFLAG" EXTRA_OPTIONS="" ;; x86) ARCH="x86" CPU="i686" MARCH="i686" TARGET=i686-linux-android CC="$TOOLCHAINS/bin/$TARGET$API-clang" CXX="$TOOLCHAINS/bin/$TARGET$API-clang++" LD="$TOOLCHAINS/bin/$TARGET$API-clang" CROSS_PREFIX="$TOOLCHAINS/bin/$TARGET-" EXTRA_CFLAGS="$CFLAG -march=$MARCH -mtune=intel -mssse3 -mfpmath=sse -m32" EXTRA_LDFLAGS="$LDFLAG" EXTRA_OPTIONS="--cpu=$CPU " ;; x86_64) ARCH="x86_64" CPU="x86-64" MARCH="x86_64" TARGET=$ARCH-linux-android CC="$TOOLCHAINS/bin/$TARGET$API-clang" CXX="$TOOLCHAINS/bin/$TARGET$API-clang++" LD="$TOOLCHAINS/bin/$TARGET$API-clang" CROSS_PREFIX="$TOOLCHAINS/bin/$TARGET-" EXTRA_CFLAGS="$CFLAG -march=$CPU -mtune=intel -msse4.2 -mpopcnt -m64" EXTRA_LDFLAGS="$LDFLAG" EXTRA_OPTIONS="--cpu=$CPU " ;; esac echo "-------- > Start clean workspace" make clean echo "-------- > Start build configuration" CONFIGURATION="$COMMON_OPTIONS" CONFIGURATION="$CONFIGURATION --logfile=$CONFIG_LOG_PATH/config_$APP_ABI.log" CONFIGURATION="$CONFIGURATION --prefix=$PREFIX" CONFIGURATION="$CONFIGURATION --libdir=$PREFIX/libs/$APP_ABI" CONFIGURATION="$CONFIGURATION --incdir=$PREFIX/includes/$APP_ABI" CONFIGURATION="$CONFIGURATION --pkgconfigdir=$PREFIX/pkgconfig/$APP_ABI" CONFIGURATION="$CONFIGURATION --cross-prefix=$CROSS_PREFIX" CONFIGURATION="$CONFIGURATION --arch=$ARCH" CONFIGURATION="$CONFIGURATION --sysroot=$SYSROOT" CONFIGURATION="$CONFIGURATION --cc=$CC" CONFIGURATION="$CONFIGURATION --cxx=$CXX" CONFIGURATION="$CONFIGURATION --ld=$LD" CONFIGURATION="$CONFIGURATION $EXTRA_OPTIONS" echo "-------- > Start config makefile with $CONFIGURATION --extra-cflags=${EXTRA_CFLAGS} --extra-ldflags=${EXTRA_LDFLAGS}" ./configure ${CONFIGURATION} \ --extra-cflags="$EXTRA_CFLAGS" \ --extra-ldflags="$EXTRA_LDFLAGS" echo "-------- > Start make $APP_ABI with -j8" make -j10 echo "-------- > Start install $APP_ABI" make install echo "++++++++ > make and install $APP_ABI complete." } build_all() { COMMON_OPTIONS="$COMMON_OPTIONS --target-os=android" COMMON_OPTIONS="$COMMON_OPTIONS --disable-static" COMMON_OPTIONS="$COMMON_OPTIONS --enable-shared" COMMON_OPTIONS="$COMMON_OPTIONS --enable-protocols" COMMON_OPTIONS="$COMMON_OPTIONS --enable-cross-compile" COMMON_OPTIONS="$COMMON_OPTIONS --enable-optimizations" COMMON_OPTIONS="$COMMON_OPTIONS --disable-debug" COMMON_OPTIONS="$COMMON_OPTIONS --enable-small" COMMON_OPTIONS="$COMMON_OPTIONS --disable-doc" COMMON_OPTIONS="$COMMON_OPTIONS --disable-programs" COMMON_OPTIONS="$COMMON_OPTIONS --disable-ffmpeg" COMMON_OPTIONS="$COMMON_OPTIONS --disable-ffplay" COMMON_OPTIONS="$COMMON_OPTIONS --disable-ffprobe" COMMON_OPTIONS="$COMMON_OPTIONS --disable-symver" COMMON_OPTIONS="$COMMON_OPTIONS --disable-network" COMMON_OPTIONS="$COMMON_OPTIONS --disable-x86asm" COMMON_OPTIONS="$COMMON_OPTIONS --disable-asm" COMMON_OPTIONS="$COMMON_OPTIONS --enable-pthreads" COMMON_OPTIONS="$COMMON_OPTIONS --enable-mediacodec" COMMON_OPTIONS="$COMMON_OPTIONS --enable-jni" COMMON_OPTIONS="$COMMON_OPTIONS --enable-zlib" COMMON_OPTIONS="$COMMON_OPTIONS --enable-pic" COMMON_OPTIONS="$COMMON_OPTIONS --enable-avresample" COMMON_OPTIONS="$COMMON_OPTIONS --enable-decoder=h264" COMMON_OPTIONS="$COMMON_OPTIONS --enable-decoder=mpeg4" COMMON_OPTIONS="$COMMON_OPTIONS --enable-decoder=mjpeg" COMMON_OPTIONS="$COMMON_OPTIONS --enable-decoder=png" COMMON_OPTIONS="$COMMON_OPTIONS --enable-decoder=vorbis" COMMON_OPTIONS="$COMMON_OPTIONS --enable-decoder=opus" COMMON_OPTIONS="$COMMON_OPTIONS --enable-decoder=flac" echo "COMMON_OPTIONS=$COMMON_OPTIONS" echo "PREFIX=$PREFIX" echo "CONFIG_LOG_PATH=$CONFIG_LOG_PATH" mkdir -p ${CONFIG_LOG_PATH} # build $app_abi build "armeabi-v7a" build "arm64-v8a" build "x86" build "x86_64" } echo "-------- Start --------" build_all echo "-------- End --------"
此脚本实现了 armeabi-v7a
,arm64-v8a
,x86
,x86_64
4个平台的编译。
-
需要设置环境变量
$NDK_PATH
路径 -
--target-os=android
指定android
平台。 -
make install-libs
表示只安装so
文件
编译完成结果:
lib
第二步,项目集成
-
新建项目,增加
C++
支持。手动创建jniLibs
文件夹 -
然后将上一步生成的所有文件复制到
jniLibs
文件夹下面
最终目录结构:project
然后修改
CMakeLists.txt
文件,集成so
。
cmake_minimum_required(VERSION 3.4.1) find_library(log-lib log) find_library(android-lib android) add_library(native-lib SHARED src/main/cpp/native-lib.cpp ) set(JNI_LIBS_DIR ${CMAKE_SOURCE_DIR}/src/main/jniLibs) add_library(avutil SHARED IMPORTED ) set_target_properties(avutil PROPERTIES IMPORTED_LOCATION ${JNI_LIBS_DIR}/${ANDROID_ABI}/libavutil.so ) add_library(avresample SHARED IMPORTED ) set_target_properties(avresample PROPERTIES IMPORTED_LOCATION ${JNI_LIBS_DIR}/${ANDROID_ABI}/libavresample.so ) add_library(swresample SHARED IMPORTED ) set_target_properties(swresample PROPERTIES IMPORTED_LOCATION ${JNI_LIBS_DIR}/${ANDROID_ABI}/libswresample.so ) add_library(swscale SHARED IMPORTED ) set_target_properties(swscale PROPERTIES IMPORTED_LOCATION ${JNI_LIBS_DIR}/${ANDROID_ABI}/libswscale.so ) add_library(avcodec SHARED IMPORTED ) set_target_properties(avcodec PROPERTIES IMPORTED_LOCATION ${JNI_LIBS_DIR}/${ANDROID_ABI}/libavcodec.so ) add_library(avformat SHARED IMPORTED ) set_target_properties(avformat PROPERTIES IMPORTED_LOCATION ${JNI_LIBS_DIR}/${ANDROID_ABI}/libavformat.so ) add_library(avfilter SHARED IMPORTED ) set_target_properties(avfilter PROPERTIES IMPORTED_LOCATION ${JNI_LIBS_DIR}/${ANDROID_ABI}/libavfilter.so ) add_library(avdevice SHARED IMPORTED ) set_target_properties(avdevice PROPERTIES IMPORTED_LOCATION ${JNI_LIBS_DIR}/${ANDROID_ABI}/libavdevice.so ) include_directories(${JNI_LIBS_DIR}/includes) target_link_libraries(native-lib avutil avresample swresample swscale avcodec avformat avfilter avdevice ${log-lib} ${android-lib} )
简要说明:
-
${ANDROID_ABI}
表示目标ABI,在官方文档中有说明:https://developer.android.com/ndk/guides/cmake.html
最后再放出效果图:
FFPlayerDemo
转自:https://www.jianshu.com/p/0a7f3175c1b9