说明

一个脚本实现 armeabi-v7a , x86 (按需添加)等多版本类型 ffmpeg 编译

环境配置

本人的环境配置如下

  1. macOS 10.12.4
  2. NDK 版本:android-ndk-r13b
  3. ffmpeg 版本:V3.2.4
    参考资料1
    参考资料2

编译步骤

  1. 修改 ffmpeg 目录下 configure 文件

    1
    2
    3
    SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'
    SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'
    SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR)$(SLIBNAME)'

    修改为如下

    1
    2
    3
    SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'
    SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'
    SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR)$(SLIBNAME)'

    ps: 参考资料说需要修改 4 处 ,对比发现资料第二处修改前后是一样的.

  2. 添加如下脚本文件 build_android.sh 到 ffmpeg 文件夹目录下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    #ndk 目录根据你的安装目录
    export ANDROID_NDK=$NDK_ROOT
    # 需要编译cup架构类型,加入下面的()中,用空格分割
    export SUPPORTED_ARCHITECTURES=(armeabi armeabi-v7a armeabi-v7a-neon x86 x86_64)
    #编译结果的目录
    export PREFIXDIR=android-lib
    # NDK 编译工具版本,参考 ANDROID_NDK/toolchains/ 目录下面文件夹末尾数字
    export NDK_TOOLCHAIN_ABI_VERSION=4.9
    # 需要支持的 Android 版本 , 参考 ANDROID_NDK/platforms/ 目录下面的文件夹名称
    export ANDROID_API_VERSION=23
    ## 配置编译环境并且编译
    function configAndMake(){
    case ${ARCH} in
    armeabi-v7a | armeabi-v7a-neon | armeabi)
    CPU='cortex-a8'
    ;;
    x86)
    CPU='i686'
    ;;
    x86_64)
    CPU="x86-64"
    ;;
    esac
    PREFIX="${PREFIXDIR}/${ARCH}"
    ./configure \
    --prefix=$PREFIX \
    --enable-shared \
    --disable-static \
    --disable-doc \
    --disable-ffmpeg \
    --disable-ffplay \
    --disable-ffprobe \
    --disable-ffserver \
    --disable-doc \
    --disable-symver \
    --enable-small \
    --cross-prefix="$CROSS_PREFIX" \
    --cpu=$CPU \
    --target-os=linux \
    --arch=$ARCH \
    --enable-cross-compile \
    --sysroot=$SYSROOT \
    --extra-cflags="-I${TOOLCHAIN}/include $CFLAGS" \
    --extra-ldflags="-L${TOOLCHAIN}/lib $LDFLAGS"
    # --extra-libs="-lpng -lexpat -lm" \
    # --extra-cxxflags="$CXX_FLAGS" || exit 1
    make clean
    make -j8
    make install
    }
    ### 设置 abi 类型对应的编译工具参数
    function initabi() {
    case $ARCH in
    armeabi)
    NDK_ABI='arm'
    NDK_TOOLCHAIN_ABI='arm-linux-androideabi'
    NDK_CROSS_PREFIX="arm-linux-androideabi"
    ;;
    armeabi-v7a)
    NDK_ABI='arm'
    NDK_TOOLCHAIN_ABI='arm-linux-androideabi'
    NDK_CROSS_PREFIX="arm-linux-androideabi"
    CFLAGS="${CFLAGS} -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16"
    LDFLAGS="${LDFLAGS} -march=armv7-a -Wl,--fix-cortex-a8"
    ;;
    armeabi-v7a-neon)
    NDK_ABI='arm'
    NDK_TOOLCHAIN_ABI='arm-linux-androideabi'
    NDK_CROSS_PREFIX="arm-linux-androideabi"
    CFLAGS="${CFLAGS} -march=armv7-a -mfloat-abi=softfp -mfpu=neon"
    LDFLAGS="${LDFLAGS} -march=armv7-a -Wl,--fix-cortex-a8"
    ;;
    x86)
    NDK_ABI='x86'
    NDK_TOOLCHAIN_ABI='x86-linux-android'
    NDK_CROSS_PREFIX="i686-linux-android"
    CFLAGS="$CFLAGS -march=i686"
    ;;
    x86_64)
    NDK_ABI='x86_64'
    NDK_TOOLCHAIN_ABI='x86_64-linux-android'
    NDK_CROSS_PREFIX="x86_64-linux-android"
    CFLAGS="$CFLAGS -march=x86-64 -m64"
    ;;
    esac
    CROSS_PREFIX=${TOOLCHAIN}/bin/${NDK_CROSS_PREFIX}-
    NDK_SYSROOT=${TOOLCHAIN}/sysroot
    export PKG_CONFIG_LIBDIR="${TOOLCHAIN}/lib/pkgconfig"
    $ANDROID_NDK/build/tools/make-standalone-toolchain.sh \
    --arch=$NDK_ABI \
    --platform=android-${ANDROID_API_VERSION} \
    --install-dir=$TOOLCHAIN \
    --force
    export CC="${CROSS_PREFIX}gcc"
    export LD="${CROSS_PREFIX}ld"
    export RANLIB="${CROSS_PREFIX}ranlib"
    export STRIP="${CROSS_PREFIX}strip"
    export READELF="${CROSS_PREFIX}readelf"
    export OBJDUMP="${CROSS_PREFIX}objdump"
    export ADDR2LINE="${CROSS_PREFIX}addr2line"
    export AR="${CROSS_PREFIX}ar"
    export AS="${CROSS_PREFIX}as"
    export CXX="${CROSS_PREFIX}g++"
    export OBJCOPY="${CROSS_PREFIX}objcopy"
    export ELFEDIT="${CROSS_PREFIX}elfedit"
    export CPP="${CROSS_PREFIX}cpp"
    export DWP="${CROSS_PREFIX}dwp"
    export GCONV="${CROSS_PREFIX}gconv"
    export GDP="${CROSS_PREFIX}gdb"
    export GPROF="${CROSS_PREFIX}gprof"
    export NM="${CROSS_PREFIX}nm"
    export SIZE="${CROSS_PREFIX}size"
    export STRINGS="${CROSS_PREFIX}strings"
    }
    ## 初始化环境参数
    function initParam(){
    CFLAGS='-O3 -fpic -pipe -w'
    LDFLAGS=' '
    FFMPEG_PKG_CONFIG="$(pwd)/ffmpeg-pkg-config"
    TOOLCHAIN=$HOME/fftoolchain #toolchain 安装目录
    SYSROOT=$TOOLCHAIN/sysroot/
    }
    ## 编译某一种 cpu 对应的 lib
    function build_one(){
    initParam
    initabi
    configAndMake
    cleaner
    }
    ## 编译所以类型 cpu 对应的 lib
    function buildAll(){
    for i in "${SUPPORTED_ARCHITECTURES[@]}"
    do
    echo "now ,start to build $i"
    ARCH=$i
    build_one
    done
    }
    ## 删除编译工具
    function cleaner(){
    rm -rf $TOOLCHAIN
    rm -rf ./compat/strtod.o
    }
    buildAll
  3. 执行 build_android.sh

    1
    2
    sudo chmod 777 build_android.sh
    ./build_android.sh

    编译完成后,ffmpeg 目录会出现 android-lib 文件夹,里面就是编译结果.

<<<<<<< HEAD