ffmpeg精簡

本文僅是個人編譯腳本記錄,有多出錯誤,僅供參考

編譯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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章