|
| 1 | +#!/bin/bash |
| 2 | + |
| 3 | +#需要编译FFpmeg版本号 |
| 4 | +FF_VERSION="3.4.2" |
| 5 | +SOURCE="ffmpeg-$FF_VERSION" |
| 6 | +SHELL_PATH=`pwd` |
| 7 | +FF_PATH=$SHELL_PATH/$SOURCE |
| 8 | +#输出路径 |
| 9 | +PREFIX=$SHELL_PATH/FFmpeg_android |
| 10 | +COMP_BUILD=$1 |
| 11 | + |
| 12 | +#需要编译的Android API版本 |
| 13 | +ANDROID_API=21 |
| 14 | +#需要编译的NDK路径,NDK版本需大等于r15c |
| 15 | +NDK=/Users/lzj/Library/Android/sdk/ndk-bundle |
| 16 | + |
| 17 | +#x264库路径 |
| 18 | +x264=$SHELL_PATH/x264_android |
| 19 | +if [ "$x264" ] && [[ $FF_VERSION == 3.0.* ]] || [[ $FF_VERSION == 3.1.* ]] |
| 20 | +then |
| 21 | +echo "Use low version x264" |
| 22 | +sh $SHELL_PATH/build-x264-android.sh $COMP_BUILD |
| 23 | +elif [ "$x264" ] |
| 24 | +then |
| 25 | +echo "Use last version x264" |
| 26 | +sh $SHELL_PATH/build-x264-android.sh $COMP_BUILD last $ANDROID_API $NDK |
| 27 | +fi |
| 28 | + |
| 29 | +#需要编译的平台:arm arm64 x86 x86_64,可传入平台单独编译对应的库 |
| 30 | +ARCHS=(arm arm64 x86 x86_64) |
| 31 | +TRIPLES=(arm-linux-androideabi aarch64-linux-android i686-linux-android x86_64-linux-android) |
| 32 | +TRIPLES_PATH=(arm-linux-androideabi-4.9 aarch64-linux-android-4.9 x86-4.9 x86_64-4.9) |
| 33 | + |
| 34 | +FF_CONFIGURE_FLAGS="--enable-static --disable-shared --enable-pic --enable-gpl --enable-postproc --disable-stripping --enable-small --enable-version3 --enable-jni --enable-mediacodec --enable-decoder=h264_mediacodec --enable-hwaccel=h264_mediacodec --enable-decoder=hevc_mediacodec --enable-decoder=mpeg4_mediacodec --enable-decoder=vp8_mediacodec --enable-decoder=vp9_mediacodec" |
| 35 | + |
| 36 | +rm -rf "$SOURCE" |
| 37 | +if [ ! -r $SOURCE ] |
| 38 | +then |
| 39 | + if [ ! -f "$SOURCE.tar.bz2" ] |
| 40 | + then |
| 41 | + echo "$SOURCE source not found, Trying to download..." |
| 42 | + curl http://www.ffmpeg.org/releases/$SOURCE.tar.bz2 | tar xj || exit 1 |
| 43 | + else |
| 44 | + mkdir $FF_PATH |
| 45 | + tar zxvf $SHELL_PATH/"$SOURCE.tar.bz2" --strip-components 1 -C $FF_PATH || exit 1 |
| 46 | + fi |
| 47 | +fi |
| 48 | + |
| 49 | +#若使用android-ndk-r15c及以上NDK需要打此补丁(修改FFmepg与NDK代码冲突) |
| 50 | +sh $SHELL_PATH/build-ffmpeg-patch.sh $FF_PATH |
| 51 | + |
| 52 | +cd $FF_PATH |
| 53 | +export TMPDIR=$FF_PATH/tmpdir |
| 54 | +mkdir $TMPDIR |
| 55 | +for i in "${!ARCHS[@]}"; |
| 56 | +do |
| 57 | + ARCH=${ARCHS[$i]} |
| 58 | + TOOLCHAIN=$NDK/toolchains/${TRIPLES_PATH[$i]}/prebuilt/darwin-x86_64 |
| 59 | + SYSROOT=$NDK/platforms/android-$ANDROID_API/arch-$ARCH/ |
| 60 | + ISYSROOT=$NDK/sysroot |
| 61 | + ASM=$ISYSROOT/usr/include/${TRIPLES[$i]} |
| 62 | + CROSS_PREFIX=$TOOLCHAIN/bin/${TRIPLES[$i]}- |
| 63 | + PREFIX_ARCH=$PREFIX/$ARCH |
| 64 | + |
| 65 | + if [ "$COMP_BUILD" = "" -o "$COMP_BUILD" = "$ARCH" ] |
| 66 | + then |
| 67 | + if [ "$ARCH" = "arm" ] |
| 68 | + then |
| 69 | + FF_EXTRA_CONFIGURE_FLAGS="--disable-asm" |
| 70 | + FF_EXTRA_CFLAGS="-fpic -ffunction-sections -funwind-tables -fstack-protector -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -fomit-frame-pointer -fstrict-aliasing -funswitch-loops -finline-limit=300" |
| 71 | + TRMP_P="eabi-v7a" |
| 72 | + PREFIX_ARCH="$PREFIX_ARCH$TRMP_P" |
| 73 | + elif [ "$ARCH" = "arm64" ] |
| 74 | + then |
| 75 | + if [ $ANDROID_API -lt 21 ] |
| 76 | + then |
| 77 | + continue |
| 78 | + else |
| 79 | + FF_EXTRA_CONFIGURE_FLAGS="" |
| 80 | + FF_EXTRA_CFLAGS="-fpic" |
| 81 | + TRMP_P="-v8a" |
| 82 | + PREFIX_ARCH="$PREFIX_ARCH$TRMP_P" |
| 83 | + fi |
| 84 | + elif [ "$ARCH" = "x86" -o "$ARCH" = "x86_64" ] |
| 85 | + then |
| 86 | + if [ "$ARCH" = "x86_64" -a $ANDROID_API -lt 21 ] |
| 87 | + then |
| 88 | + continue |
| 89 | + else |
| 90 | + FF_EXTRA_CONFIGURE_FLAGS="--disable-asm" |
| 91 | + FF_EXTRA_CFLAGS="-fpic -Dipv6mr_interface=ipv6mr_ifindex -fasm -Wno-psabi -fno-short-enums -fno-strict-aliasing -fomit-frame-pointer -march=k8" |
| 92 | + fi |
| 93 | + else |
| 94 | + echo "Unrecognized arch:$ARCH" |
| 95 | + exit 1 |
| 96 | + fi |
| 97 | + |
| 98 | + if [ "$x264" ] |
| 99 | + then |
| 100 | + FF_EXTRA_CONFIGURE_FLAGS="$FF_EXTRA_CONFIGURE_FLAGS --enable-libx264 --enable-encoder=libx264" |
| 101 | + FF_EXTRA_CFLAGS="$FF_EXTRA_CFLAGS -I$x264/${ARCHS[$i]}$TRMP_P/include" |
| 102 | + FF_LDFLAGS="-L$x264/${ARCHS[$i]}$TRMP_P/lib" |
| 103 | + else |
| 104 | + FF_LDFLAGS="" |
| 105 | + fi |
| 106 | + else |
| 107 | + continue |
| 108 | + fi |
| 109 | + FF_CFLAGS="-I$ASM -isysroot $ISYSROOT -D__ANDROID_API__=$ANDROID_API -U_FILE_OFFSET_BITS -O3 -pipe -Wall -ffast-math -fstrict-aliasing -Werror=strict-aliasing -Wno-psabi -Wa,--noexecstack -DANDROID" |
| 110 | + |
| 111 | + ./configure \ |
| 112 | + --prefix=$PREFIX_ARCH \ |
| 113 | + --sysroot=$SYSROOT \ |
| 114 | + --target-os=android \ |
| 115 | + --arch=$ARCH \ |
| 116 | + --cross-prefix=$CROSS_PREFIX \ |
| 117 | + --enable-cross-compile \ |
| 118 | + --disable-runtime-cpudetect \ |
| 119 | + --disable-doc \ |
| 120 | + --disable-debug \ |
| 121 | + --disable-ffmpeg \ |
| 122 | + --disable-ffprobe \ |
| 123 | + --disable-ffserver \ |
| 124 | + $FF_CONFIGURE_FLAGS \ |
| 125 | + $FF_EXTRA_CONFIGURE_FLAGS \ |
| 126 | + --extra-cflags="$FF_EXTRA_CFLAGS $FF_CFLAGS" \ |
| 127 | + --extra-ldflags="$FF_LDFLAGS" \ |
| 128 | + $ADDITIONAL_CONFIGURE_FLAG || exit 1 |
| 129 | + make -j3 install || exit 1 |
| 130 | + make distclean |
| 131 | + rm -rf "$PREFIX_ARCH/share" |
| 132 | + rm -rf "$PREFIX_ARCH/lib/pkgconfig" |
| 133 | +done |
| 134 | + |
| 135 | +echo "Android FFmpeg bulid success!" |
| 136 | + |
| 137 | + |
0 commit comments