My Build Environment

  • Common
  • Mac OS  10.14.6
  • Android
  • NDK r20b (对应android-ndk-r20b-darwin-x86_64.zip)
  • FFmpeg 目前最新版本4.2.2,我用的版本是4.2.2 

注意使用对应版本,其他平台版本没有测试

Android 的 NDK 已经迭代了很多版本,在 r17c 以后,Google正式移除 GCC ,不再支持 GCC ,新版本的 NDK 都是使用 CLANG 进行编译。这里就使用目前最新的 NDK r20b 版本来编译。

最主要的就是这两个路径:

编译工具链目录:toolchains/llvm/prebuilt/darwin-x86_64/bin交叉编译环境目录:toolchains/llvm/prebuilt/darwin-x86_64/sysroot

编译工具路径

根据不同的CPU架构区和不同的Android版本,区分了不同的clang工具,根据自己需要选择就好了。

本文选择 CPU 架构 armv7a,Android版本 21:

armv7a-linux-androideabi21-clangarmv7a-linux-androideabi21-clang++

在 toolchains/llvm/prebuilt/darwin-x86_64/sysroot 目录下,包含了两个目录: usr/includeusr/lib,分别对应了 头文件 和 库文件

 

下载FFmpeg源码

下载好源码后,进入根目录,找到一个名为 congfigure 的文件,这是一个shell脚本,用于生成一些 FFmpeg 编译需要的配置文件。

网上很多教程会对此文件进行修改,但是3.4版本后不需要更改configure文件内容,下载解压后就ok,主要是后面脚本配置两步

现在正式开始核心步骤

1、源码下载好后啥都不用改,直接编写编译脚本 在源码根目录新建 build_android.sh

#!/bin/bash#你的NDK路径NDK=/Users/pro/Library/Android/sdk/ndk/android-ndk-r20bTOOLCHAIN=$NDK/toolchains/llvm/prebuilt/darwin-x86_64API=21echo "进入FFmpeg编译脚本"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_FLAGSmake cleanmake -j8 # 这里是定义用几个CPU编译make installecho "The Compilation of FFmpeg for $CPU is completed"}#################### armv7-a ################################echo "开始编译FFmpeg(armeabi-v7a)"source "config-env.sh"OUTPUT_FOLDER="armeabi-v7a"ARCH="arm"CPU="armv7-a"TOOL_CPU_NAME=armv7aTOOL_PREFIX="$TOOLCHAIN/bin/arm-linux-androideabi"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/libs/$OUTPUT_FOLDER"OPTIMIZE_CFLAGS="-march=$CPU"build_android#################### armv8-a ################################# echo "开始编译FFmpeg(arm64-v8a)"# source "config-env.sh"# OUTPUT_FOLDER="arm64-v8a"# ARCH=arm64# CPU="armv8-a"# TOOL_CPU_NAME=aarch64# 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/libs/$OUTPUT_FOLDER"# OPTIMIZE_CFLAGS="-march=$CPU"# build_android#################### x86 ################################# echo "开始编译FFmpeg(x86)"# source "config-env.sh"# 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/libs/$OUTPUT_FOLDER"# OPTIMIZE_CFLAGS="-march=i686 -mtune=intel -mssse3 -mfpmath=sse -m32"# build_android#################### x86_64 ################################# echo "开始编译FFmpeg(x86_64)"# source "config-env.sh"# 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/libs/$OUTPUT_FOLDER"# OPTIMIZE_CFLAGS="-march=$CPU"# build_android

2、在源码根目录新建config-env.sh

#! /usr/bin/env bash# shell/config.sh# 这个来自ijkplayer的ffmpeg配置, 会在上面的build脚本中被引入#--------------------# Standard options:export COMMON_FF_CFG_FLAGS=# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --prefix=PREFIX"# Licensing options:export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-gpl"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-version3"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-nonfree"# Configuration options:# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-static"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-shared"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-small"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-runtime-cpudetect"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-gray"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-swscale-alpha"# Program options:export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-programs"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-ffmpeg"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-ffplay"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-ffprobe"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-ffserver"# Documentation options:export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-doc"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-htmlpages"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-manpages"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-podpages"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-txtpages"# Component options:export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-avdevice"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-avcodec"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-avformat"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-avutil"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-swresample"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-swscale"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-postproc"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-avfilter"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-avresample"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-pthreads"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-w32threads"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-os2threads"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-network"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-dct"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-dwt"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-lsp"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-lzo"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-mdct"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-rdft"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-fft"# Hardware accelerators:export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-d3d11va"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-dxva2"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-vaapi"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-vda"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-vdpau"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-videotoolbox"# Individual component options:# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-everything"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-encoders"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-encoder=png"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-encoder=mjpeg"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-encoder=jpeg2000"# ./configure --list-decodersexport COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-decoders"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-decoder=aac"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-decoder=aac_latm"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-decoder=flv"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-decoder=h264"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-decoder=mp3*"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-decoder=vp6f"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-decoder=flac"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-decoder=hevc"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-decoder=vp8"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-decoder=vp9"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-decoder=h263"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-decoder=h263i"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-decoder=h263p"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-decoder=mpeg4"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-decoder=mjpeg"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-hwaccels"# ./configure --list-muxersexport COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-muxers"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-muxer=mp4"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-muxer=mjpeg"# ./configure --list-demuxersexport COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-demuxers"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=aac"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=concat"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=data"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=flv"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=hls"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=live_flv"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=mov"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=mp3"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=mpegps"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=mpegts"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=mpegvideo"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=flac"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=hevc"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=webm_dash_manifest"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=mpeg4"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=rtsp"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=mjpeg"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=avi"# ./configure --list-parsersexport COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-parsers"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-parser=aac"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-parser=aac_latm"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-parser=h264"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-parser=flac"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-parser=hevc"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-parser=mpeg4"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-parser=mpeg4video"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-parser=mpegvideo"# ./configure --list-bsfexport COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-bsfs"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-bsf=chomp"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-bsf=dca_core"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-bsf=dump_extradata"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-bsf=hevc_mp4toannexb"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-bsf=imx_dump_header"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-bsf=mjpeg2jpeg"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-bsf=mjpega_dump_header"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-bsf=mov2textsub"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-bsf=mp3_header_decompress"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-bsf=mpeg4_unpack_bframes"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-bsf=noise"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-bsf=remove_extradata"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-bsf=text2movsub"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-bsf=vp9_superframe"# ./configure --list-protocolsexport COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-protocols"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-protocol=async"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-protocol=bluray"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-protocol=concat"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-protocol=crypto"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-protocol=ffrtmpcrypt"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-protocol=ffrtmphttp"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-protocol=gopher"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-protocol=icecast"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-protocol=librtmp*"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-protocol=libssh"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-protocol=md5"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-protocol=mmsh"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-protocol=mmst"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-protocol=rtmp*"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-protocol=rtmp"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-protocol=rtmpt"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-protocol=rtp"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-protocol=sctp"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-protocol=srtp"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-protocol=subfile"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-protocol=unix"#export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-devices"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-filters"# External library support:export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-iconv"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-audiotoolbox"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-videotoolbox"# ...# Advanced options (experts only):# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --cross-prefix=${FF_CROSS_PREFIX}-"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-cross-compile"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --sysroot=PATH"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --sysinclude=PATH"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --target-os=TAGET_OS"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --target-exec=CMD"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --target-path=DIR"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --toolchain=NAME"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --nm=NM"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --ar=AR"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --as=AS"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --yasmexe=EXE"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --cc=CC"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --cxx=CXX"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --dep-cc=DEPCC"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --ld=LD"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --host-cc=HOSTCC"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --host-cflags=HCFLAGS"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --host-cppflags=HCPPFLAGS"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --host-ld=HOSTLD"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --host-ldflags=HLDFLAGS"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --host-libs=HLIBS"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --host-os=OS"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --extra-cflags=ECFLAGS"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --extra-cxxflags=ECFLAGS"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --extra-ldflags=ELDFLAGS"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --extra-libs=ELIBS"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --extra-version=STRING"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --optflags=OPTFLAGS"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --build-suffix=SUFFIX"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --malloc-prefix=PREFIX"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --progs-suffix=SUFFIX"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --arch=ARCH"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --cpu=CPU"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-pic"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-sram"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-thumb"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-symver"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-hardcoded-tables"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-safe-bitstream-reader"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-memalign-hack"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-lto"# Optimization options (experts only):# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-asm"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-altivec"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-amd3dnow"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-amd3dnowext"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-mmx"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-mmxext"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-sse"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-sse2"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-sse3"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-ssse3"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-sse4"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-sse42"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-avx"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-fma4"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-armv5te"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-armv6"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-armv6t2"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-vfp"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-neon"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-vis"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-inline-asm"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-yasm"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-mips32r2"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-mipsdspr1"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-mipsdspr2"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-mipsfpu"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-fast-unaligned"# Developer options (useful when working on FFmpeg itself):# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-coverage"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-debug"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-debug=LEVEL"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-optimizations"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-extra-warnings"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-stripping"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --assert-level=level"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-memory-poisoning"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --valgrind=VALGRIND"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-ftrapv"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --samples=PATH"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-xmm-clobber-test"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-random"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-random"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-random=LIST"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-random=LIST"# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --random-seed=VALUE"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-linux-perf"export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-bzlib"

3、终端切换到源码根目录 执行 

chmod +x build_android.sh

4、启动编译

编译完成在源码根目录下android文件夹生成so库

整个过程就编译完成了。

只编译大部分so,还有两三个没编译出来,自己可以根据config-env.sh配置修改开启相关选项,下面试开启所有的,奇怪enable-postproc设置了没有输出对应的so

 

以下是一键打出armeabi-v7a,arm64-v8a,x86,x86_64 so架构脚本

部分参数可再精简合并

#!/bin/bash#你的NDK路径NDK=/Users/pro/Library/Android/sdk/ndk/android-ndk-r20bTOOLCHAIN=$NDK/toolchains/llvm/prebuilt/darwin-x86_64API=21echo "进入FFmpeg编译脚本"COMMON_OPTIONS="\    --enable-shared \    --disable-static \    --enable-jni \    --disable-doc \    --disable-symver \    --disable-programs \    --target-os=android \    --disable-asm \    --enable-cross-compile    "function build_android{echo "开始编译FFmpeg(armeabi-v7a)"source "config-env.sh"OUTPUT_FOLDER="armeabi-v7a"ARCH="arm"CPU="armv7-a"TOOL_CPU_NAME=armv7aTOOL_PREFIX="$TOOLCHAIN/bin/arm-linux-androideabi"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/libs/$OUTPUT_FOLDER"OPTIMIZE_CFLAGS="-march=$CPU"./configure \    --prefix=$PREFIX \    --libdir=$LIB_DIR \    --arch=$ARCH \    --cpu=$CPU \    --cc=$CC \    --cxx=$CXX \    --sysroot=$SYSROOT \    --extra-cflags="-Os -fpic $OPTIMIZE_CFLAGS" \    --extra-ldflags="$ADDI_LDFLAGS" \    $COMMON_OPTIONS \    $COMMON_FF_CFG_FLAGSmake cleanmake -j8make installecho "The Compilation of FFmpeg for $CPU is completed"echo "FFmpeg $CPU 编译完成"##################################################################echo "开始编译FFmpeg(arm64-v8a)"source "config-env.sh"OUTPUT_FOLDER="arm64-v8a"ARCH=arm64CPU="armv8-a"TOOL_CPU_NAME=aarch64TOOL_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/libs/$OUTPUT_FOLDER"OPTIMIZE_CFLAGS="-march=$CPU"./configure \    --prefix=$PREFIX \    --libdir=$LIB_DIR \    --arch=$ARCH \    --cpu=$CPU \    --cc=$CC \    --cxx=$CXX \    --sysroot=$SYSROOT \    --extra-cflags="-Os -fpic $OPTIMIZE_CFLAGS" \    --extra-ldflags="$ADDI_LDFLAGS" \    $COMMON_OPTIONS \    $COMMON_FF_CFG_FLAGSmake cleanmake -j8make installecho "The Compilation of FFmpeg for $CPU is completed"echo "FFmpeg $CPU 编译完成"#################################################################echo "开始编译FFmpeg(x86)"source "config-env.sh"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/libs/$OUTPUT_FOLDER"OPTIMIZE_CFLAGS="-march=i686 -mtune=intel -mssse3 -mfpmath=sse -m32"./configure \    --prefix=$PREFIX \    --libdir=$LIB_DIR \    --arch=$ARCH \    --cpu=$CPU \    --cc=$CC \    --cxx=$CXX \    --sysroot=$SYSROOT \    --extra-cflags="-Os -fpic $OPTIMIZE_CFLAGS" \    --extra-ldflags="$ADDI_LDFLAGS" \    $COMMON_OPTIONS \    $COMMON_FF_CFG_FLAGSmake cleanmake -j8make installecho "The Compilation of FFmpeg for $CPU is completed"echo "FFmpeg $CPU 编译完成"#############################################################echo "开始编译FFmpeg(x86_64)"source "config-env.sh"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/libs/$OUTPUT_FOLDER"OPTIMIZE_CFLAGS="-march=$CPU"./configure \    --prefix=$PREFIX \    --libdir=$LIB_DIR \    --arch=$ARCH \    --cpu=$CPU \    --cc=$CC \    --cxx=$CXX \    --sysroot=$SYSROOT \    --extra-cflags="-Os -fpic $OPTIMIZE_CFLAGS" \    --extra-ldflags="$ADDI_LDFLAGS" \    $COMMON_OPTIONS \    $COMMON_FF_CFG_FLAGSmake cleanmake -j8make installecho "The Compilation of FFmpeg for $CPU is completed"echo "FFmpeg $CPU 编译完成"echo "FFmpeg 所有so架构 编译完成"}build_android

输出如下目录文件 

后面开篇集成到Android Studio中

更多相关文章

  1. Android(安卓)Studio 编译缓存(Build Cache)
  2. android源码下载方法 批量下载 基于windows os
  3. android 编译命令
  4. Android(第一季重制版)
  5. android使用ffmpeg的实例程序
  6. Android源码下载(包括最新8.0版本)
  7. Ubuntu下ndk-build编译C++出错:non-numeric second argument to `
  8. [置顶] android自动化测试之CTS
  9. ubuntu 中 gcc/g++版本降级

随机推荐

  1. h5和app交互
  2. Android让手机振动一下
  3. Android(安卓)framework analysis (partI
  4. android之Dialog相关
  5. Android(安卓)详解build.gradle文件
  6. 【Android每日点滴】Fragment与Activity
  7. Android实用闹钟开发(三)---AlarmManager
  8. 【Android(安卓)UI设计】之自定义计时器
  9. 认识 Android(安卓)Service
  10. android ViewTreeObserver详细讲解