Android音视频之编译ffmpeg

403 阅读1分钟

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最新源码 

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库,头文件