1.android编译FFmpeg
2.详解自定义编译FFmpeg脚本
3.集成到android项目,编写JNI,可执行FFmpeg命令
编译踩坑问题汇总
1. 安装homebrew(及其安装编译ffmpeg的支持库)
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
安装失败的话可以去设置镜像,具体去看www.jianshu.com/p/7ef9e0e4d… ,或者设置终端代理zhuanlan.zhihu.com/p/124897287
2.下载ffmpeg最新源码
- 去官网直接下载源码 ffmpeg.org/download.ht…
- 通过brew install ffmpeg去安装
3.下载最新21ndk
4.配置bash_profile环境变量(ndk路径)
- open ~/.bash_profile
- 复制以下
- export ANDROID_NDK=/Users/xxx/worksplace/ndk/android-ndk-r21
- export ANDROID_SDK=/Users/xxx/Library/Android/sdk
- 保存 关闭编辑器
- source ~/.bash_profile
5.尝试通过终端初试编译ffmpeg
- cd ffmpeg-4.3
- ./configure
- make clean && make -j12 && make install
make clean清除缓存
make -j12指定编译线程,一般是电脑cpu核心数 * 2 编译完成后,会在目录下出现 终端中输入 ffplay xxx.mp4 ffplay xxx.mp3 可以直接播放,这时,ffmpeg就算是成功了。
6.编写ffmpeg运行脚本(这里是动态库,没有做整合成静态库)
在ffmpeg-4.3文件目录下创建 build_android.sh ,其中TOOLCHAIN的路径是和ndk19以前是有变化的,具体请看官方文档developer.android.google.cn/ndk/guides/…
下文中 /Users/xxxx/worksplace/ndk/android-ndk-r21需要替换成自己本地的路径
#!/bin/bash
NDK=/Users/xxxx/worksplace/ndk/android-ndk-r21
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/darwin-x86_64
API=21
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 -j12
make install
echo "The Compilation of FFmpeg for $CPU is completed"
}
# armv8-a
OUTPUT_FOLDER="arm64-v8a"
ARCH=arm64
CPU="armv8-a"
TOOL_CPU_NAME=aarch64
TOOL_PREFIX="$TOOLCHAIN/bin/$TOOL_CPU_NAME-linux-android"
TOOLCHAIN_BASE="aarch64-linux-android"
AOSP_ARCH="arch-arm64"
PLATFORM="/Users/xxxx/worksplace/ndk/android-ndk-r21/platforms/android-$API/$AOSP_ARCH"
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/$OUTPUT_FOLDER"
OPTIMIZE_CFLAGS="-march=$CPU"
build_android
# armv7-a
OUTPUT_FOLDER="armeabi-v7a"
ARCH="arm"
CPU="armv7-a"
TOOL_CPU_NAME=armv7a
TOOL_PREFIX="$TOOLCHAIN/bin/arm-linux-androideabi"
TOOLCHAIN_BASE="arm-linux-androideabi"
AOSP_ARCH="arch-arm"
AOSP_ABI="armeabi-v7a"
PLATFORM="/Users/xxx/worksplace/ndk/android-ndk-r21/platforms/android-$API/$AOSP_ARCH"
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/$OUTPUT_FOLDER"
OPTIMIZE_CFLAGS="-march=$CPU"
build_android
# 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/$OUTPUT_FOLDER"
OPTIMIZE_CFLAGS="-march=i686 -mtune=intel -mssse3 -mfpmath=sse -m32"
build_android
# 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/$OUTPUT_FOLDER"
OPTIMIZE_CFLAGS="-march=$CPU"
build_android
7.在终端运行编写后的脚本
- cd ffmpeg-4.3
- ./build_android.sh
可以得到各个不同cpu的so库,头文件