本文仅是个人编译脚本记录,有多出错误,仅供参考
编译32位库测试可通过,64位库使用r10e可编译通过arm64,x86_64,但是mips64编译有错,后序更改.
注:
1、android、交叉编译;
2、可加入--enable-small 选项进一步减小库大小,但使用过程中,会有crash的情况,因此未加入此选项;
3、此脚本适用场景,播放mov网络点播,rtmp直播;
脚本:
#!/bin/bash
FF_ARCH="all32"
if [ $# -lt 1 ]; then
echo "Not specify ARCH, use 'all32'."
elif [ $# -gt 1 ]; then
echo "Too many ARCH arguments. ARCH must be one of 'armv5|armv7a|arm32|arm64|arm|x86|x86_64|mips|mips64|all32|all64|all'."
exit 1
else
FF_ARCH=$1
echo "Specify ARCH:$FF_ARCH."
fi
# Environment
LOCAL_PATH=`pwd`
NDK=/usr/local/src/android/android-ndk-r8e
#NDK64=/usr/local/src/android/android-ndk-r10e
FF_ANDROID_PLATFORM=android-8
FF_GCC_VER=4.6
#FF_GCC_64_VER=4.9
FF_CROSS_PREFIX=
FF_CFG_FLAGS=
FF_EXTRA_CFLAGS=
FF_EXTRA_LDFLAGS=
BUILD_PATH=$LOCAL_PATH/build
PLATFORM=
PREBUILT=
PREFIX=
FF_CFLAGS="-O3 -Wall -pipe \
-std=c99 \
-ffast-math \
-fstrict-aliasing -Werror=strict-aliasing \
-Wno-psabi -Wa,--noexecstack \
-DANDROID -DNDEBUG"
echo "Local path : $LOCAL_PATH"
echo "NDK path : $NDK"
if [[ $FF_ARCH = all* ]]; then
echo "rm build path, recreate it"
rm -rf $BUILD_PATH
mkdir -p $BUILD_PATH
fi
function show_options ()
{
echo "****************** show options begin ******************"
echo "Android platform : $FF_ANDROID_PLATFORM"
echo "GCC version : $FF_GCC_VER"
echo "Cross prefix : $FF_CROSS_PREFIX"
echo "CFG flags : $FF_CFG_FLAGS"
echo "Extra cflags : $FF_EXTRA_CFLAGS"
echo "Extra ldflags : $FF_EXTRA_LDFLAGS"
echo "Platform : $PLATFORM"
echo "Prebuild : $PREBUILT"
echo "Build prefix : $PREFIX"
echo "****************** show options end ******************"
}
function build ()
{
cd ffmpeg
make clean
./configure \
${FF_CFG_FLAGS} \
--target-os=linux \
--prefix=$PREFIX \
--enable-version3 \
--enable-gpl \
--disable-debug \
--enable-memalign-hack \
--enable-asm \
--disable-shared \
--enable-static \
\
--disable-programs \
--disable-doc \
--disable-avdevice \
--disable-postproc \
--disable-avfilter \
--disable-w32threads \
--disable-avdevice \
--enable-pthreads \
--enable-network \
\
--disable-everything \
\
--enable-decoder=h264 \
--enable-decoder=aac \
\
--enable-demuxer=flv \
--enable-demuxer=mov \
\
--enable-protocol=rtmp \
--enable-protocol=http \
\
--disable-zlib \
--disable-bzlib \
\
--cc=$PREBUILT/bin/${FF_CROSS_PREFIX}-gcc \
--cross-prefix=$PREBUILT/bin/${FF_CROSS_PREFIX}- \
--nm=$PREBUILT/bin/${FF_CROSS_PREFIX}-nm \
--sysroot=$PLATFORM \
--extra-cflags="${FF_CFLAGS} ${FF_EXTRA_CFLAGS}" \
--extra-ldflags="${FF_EXTRA_LDFLAGS}"
make -j4 install
cd -
}
# 1
function build_armv5 ()
{
echo "build armv5"
FF_ARCH=arm
FF_CROSS_PREFIX=arm-linux-androideabi
FF_ANDROID_PLATFORM=android-8
PLATFORM=$NDK/platforms/${FF_ANDROID_PLATFORM}/arch-${FF_ARCH}
PREBUILT=$NDK/toolchains/${FF_CROSS_PREFIX}-${FF_GCC_VER}/prebuilt/linux-x86_64
FF_CFG_FLAGS=" --arch=arm --disable-neon"
FF_EXTRA_CFLAGS=
FF_EXTRA_LDFLAGS=
PREFIX=$BUILD_PATH/armeabi
show_options
build
echo "build armv5 end"
}
# 2
function build_armv7a ()
{
echo "build armv7a"
FF_ARCH=arm
FF_CROSS_PREFIX=arm-linux-androideabi
FF_ANDROID_PLATFORM=android-8
PLATFORM=$NDK/platforms/${FF_ANDROID_PLATFORM}/arch-${FF_ARCH}
PREBUILT=$NDK/toolchains/${FF_CROSS_PREFIX}-${FF_GCC_VER}/prebuilt/linux-x86_64
FF_CFG_FLAGS=" --arch=arm --cpu=cortex-a8 --enable-neon --enable-thumb --disable-armv5te --disable-armv6 --disable-armv6t2"
FF_EXTRA_CFLAGS=" -march=armv7-a -mcpu=cortex-a8 -mfpu=vfpv3-d16 -mfloat-abi=softfp -mthumb"
FF_EXTRA_LDFLAGS=" -Wl,--fix-cortex-a8"
PREFIX=$BUILD_PATH/armeabi-v7a
show_options
build
echo "build armv7a end"
}
# 3
function build_arm64-v8a ()
{
FF_CROSS_PREFIX=aarch64-linux-android
FF_CFG_FLAGS=" --arch=aarch64 --enable-yasm"
FF_ANDROID_PLATFORM=android-21
FF_EXTRA_CFLAGS=
FF_EXTRA_LDFLAGS=
PLATFORM=$NDK/platforms/${FF_ANDROID_PLATFORM}/arch-${FF_ARCH}
PREBUILT=$NDK/toolchains/${FF_CROSS_PREFIX}-${FF_GCC_64_VER}/prebuilt/linux-x86
PREFIX=$BUILD_PATH/arm64-v8a
show_options
build
}
# 4
function build_arm32 ()
{
build_armv5
build_armv7a
}
# 5
function build_arm64 ()
{
build_arm64-v8a
}
# 6
function build_arm ()
{
build_arm32
build_arm64
}
# 7
function build_x86 ()
{
echo "build x86"
FF_ARCH=x86
FF_CROSS_PREFIX=i686-linux-android
FF_ANDROID_PLATFORM=android-14
FF_CFG_FLAGS=" --arch=x86 --cpu=i686 --enable-yasm"
FF_EXTRA_CFLAGS=" -march=atom -msse3 -ffast-math -mfpmath=sse"
FF_EXTRA_LDFLAGS=
PLATFORM=$NDK/platforms/${FF_ANDROID_PLATFORM}/arch-${FF_ARCH}
PREBUILT=$NDK/toolchains/${FF_ARCH}-${FF_GCC_VER}/prebuilt/linux-x86_64
PREFIX=$BUILD_PATH/x86
show_options
build
echo "build x86 end"
}
# 8
function build_x86_64 ()
{
FF_ARCH=x86_64
FF_CROSS_PREFIX=x86_64-linux-android
FF_ANDROID_PLATFORM=android-21
FF_CFG_FLAGS=" --arch=x86_64 --enable-yasm"
FF_EXTRA_CFLAGS=" -march=atom -msse3 -ffast-math -mfpmath=sse"
FF_EXTRA_LDFLAGS=
PLATFORM=$NDK/platforms/${FF_ANDROID_PLATFORM}/arch-${FF_ARCH}
PREBUILT=$NDK/toolchains/${FF_ARCH}-${FF_GCC_64_VER}/prebuilt/linux-x86
PREFIX=$BUILD_PATH/x86_64
show_options
build
}
# 9
function build_mips ()
{
echo "build mips"
FF_ARCH=mips
FF_CROSS_PREFIX=mipsel-linux-android
FF_ANDROID_PLATFORM=android-14
FF_CFG_FLAGS=" --arch=mips --enable-yasm"
FF_EXTRA_CFLAGS=
FF_EXTRA_LDFLAGS=" -lm"
PLATFORM=$NDK/platforms/${FF_ANDROID_PLATFORM}/arch-${FF_ARCH}
PREBUILT=$NDK/toolchains/${FF_CROSS_PREFIX}-${FF_GCC_VER}/prebuilt/linux-x86_64
PREFIX=$BUILD_PATH/mips
show_options
build
echo "build mips end"
}
# 10 it is wrong
function build_mips64 ()
{
FF_ARCH=mips64
FF_CROSS_PREFIX=mips64el-linux-android
FF_ANDROID_PLATFORM=android-21
FF_CFG_FLAGS=" --arch=mips64 --enable-yasm"
FF_EXTRA_CFLAGS=
FF_EXTRA_LDFLAGS=" -lm"
PLATFORM=$NDK/platforms/${FF_ANDROID_PLATFORM}/arch-${FF_ARCH}
PREBUILT=$NDK/toolchains/${FF_CROSS_PREFIX}-${FF_GCC_64_VER}/prebuilt/linux-x86
PREFIX=$BUILD_PATH/mips64
show_options
build
}
# 11
function build_all32 ()
{
build_arm32
build_x86
build_mips
}
# 12
function build_all64 ()
{
build_arm64
build_x86_64
build_mips64
}
# 13
function build_all ()
{
build_all32
build_all64
}
case $FF_ARCH in
armv5)
echo "****** build armv5 ******"
build_armv5
;;
armv7a)
echo "****** build armv7a ******"
build_armv7a
;;
arm32)
echo "****** build armv5 armv7a ******"
build_arm32
;;
arm64)
echo "****** build arm64-v8a ******"
build_arm64
;;
arm)
echo "****** build armv5 armv7a arm64-v8a ******"
build_arm
;;
x86)
echo "****** build x86 ******"
build_x86
;;
x86_64)
echo "****** build x86_64 ******"
build_x86_64
;;
mips)
echo "****** build mips ******"
build_mips
;;
mips64)
echo "****** build mips64 ******"
build_mips64
;;
all32)
echo "****** build all32(armv5 armv7a x86 mips) ******"
build_all32
;;
all64)
echo "****** build all64(arm74-v8a x86_64 mips64) ******"
build_all64
;;
all)
echo "****** build all(armv5 armv7a arm64-v8a x86 x86_64 mips mips64) ******"
build_all
;;
*)
echo "ARCH:$FF_ARCH is not supported, ARCH must be one of 'all|arm|armv5|armv7a|x86|mips'."
;;
esac