ffmpeg编译脚本(整理)

1、ffmpeg

#!/bin/bash 

# ndk路径 
NDK=/ff/ndk/android-ndk-r21b 

# 编译工具链目录,ndk17版本以上用的是clang,以下是gcc 
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64
# 版本号 
API=21 
# 交叉编译树的根目录(查找相应头文件和库用) 
SYSROOT="${TOOLCHAIN}/sysroot"

#armv7-a 
OUTPUT_FOLDER="armeabi-v7a"
ARCH="arm"
CPU="armv7-a"
TOOL_CPU_NAME=armv7a
TOOL_PREFIX="$TOOLCHAIN/bin/${TOOL_CPU_NAME}-linux-androideabi"
OPTIMIZE_CFLAGS="-march=$CPU"

# arm64-v8a,这个指令集最低支持api21
# OUTPUT_FOLDER="arm64-v8a"
# ARCH="aarch64"
# CPU="armv8-a"
# TOOL_CPU_NAME=aarch64
# TOOL_PREFIX="$TOOLCHAIN/bin/${TOOL_CPU_NAME}-linux-android"
# OPTIMIZE_CFLAGS="-march=$CPU"

#x86
#OUTPUT_FOLDER="x86"
#ARCH="x86"
#CPU="x86"
#TOOL_CPU_NAME="i686"
#TOOL_PREFIX="$TOOLCHAIN/bin/${TOOL_CPU_NAME}-linux-android"
#OPTIMIZE_CFLAGS="-march=i686 -mtune=intel -mssse3 -mfpmath=sse -m32"

# x86_64,这个指令集最低支持api21
# OUTPUT_FOLDER="x86_64"
# ARCH="x86_64"
# CPU="x86_64"
# TOOL_CPU_NAME="x86_64"
# TOOL_PREFIX="$TOOLCHAIN/bin/${TOOL_CPU_NAME}-linux-android"
# OPTIMIZE_CFLAGS="-march=$CPU" 


# 输出目录 
PREFIX="${PWD}/android/$OUTPUT_FOLDER" 
# so的输出目录, --libdir=$LIB_DIR 可以不用指定,默认会生成在$PREFIX/lib目录中 
#LIB_DIR="${PWD}/android/libs/$OUTPUT_FOLDER" 

# 编译器 
CC="${TOOL_PREFIX}${API}-clang" 
CXX="${TOOL_PREFIX}${API}-clang++" 

# 执行 configure 脚本生成 Makefile 构建脚本
./configure \
--prefix=$PREFIX \
--disable-programs \
--disable-avdevice \
--enable-cross-compile \
--cc=$CC \
--cxx=$CXX \
--sysroot=$SYSROOT \
--extra-cflags="$FLAGS" \
--arch=$ARCH \
--target-os=android

# 清除之前的编译内容
make clean

# 开启新的 FFMPEG 编译
make install

2、x264

#!/bin/bash

echo ">>>>>>>>> build x264 for android arm-v7a <<<<<<<<"

#NDK位置,编译结果保存位置
export NDK=/ff/ndk/android-ndk-r21b
export TARGET=$(pwd)/android/arm

#C、C++编译器所在位置
export PLATFORM=linux-x86_64
export TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/$PLATFORM
export CC=$TOOLCHAIN/bin/armv7a-linux-androideabi21-clang
export CXX=$TOOLCHAIN/bin/armv7a-linux-androideabi21-clang++


function build
{
echo ">>>>>>>> build start <<<<<<<<<<"

./configure \
	--prefix=$TARGET \
	--enable-static \
	--enable-shared \
	--enable-pic \
	--host=arm-linux \
	--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
	--sysroot=$TOOLCHAIN/sysroot \

make clean
make
make install

echo ">>>>>> build done <<<<<<"
}

build

3、ffmpeg_width_x264

#!/bin/bash 

# ndk路径 
NDK=/ff/ndk/android-ndk-r21b
X264=/ff/x264/x264-snapshot-20191217-2245

# 编译工具链目录,ndk17版本以上用的是clang,以下是gcc 
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64

export PKG_CONFIG_PATH=/ff/x264/x264-snapshot-20191217-2245/android/arm/lib/pkgconfig;


# 版本号 
API=21 
# 交叉编译树的根目录(查找相应头文件和库用) 
SYSROOT="${TOOLCHAIN}/sysroot"

#X264
X264_INCLUDE=$X264/android/arm/include
X264_LIB=$X264/android/arm/lib

#armv7-a 
OUTPUT_FOLDER="armeabi-v7a"
ARCH="arm"
CPU="armv7-a"
TOOL_CPU_NAME=armv7a
TOOL_PREFIX="$TOOLCHAIN/bin/${TOOL_CPU_NAME}-linux-androideabi"
OPTIMIZE_CFLAGS="-march=$CPU"

# arm64-v8a,这个指令集最低支持api21
# OUTPUT_FOLDER="arm64-v8a"
# ARCH="aarch64"
# CPU="armv8-a"
# TOOL_CPU_NAME=aarch64
# TOOL_PREFIX="$TOOLCHAIN/bin/${TOOL_CPU_NAME}-linux-android"
# OPTIMIZE_CFLAGS="-march=$CPU"

#x86
#OUTPUT_FOLDER="x86"
#ARCH="x86"
#CPU="x86"
#TOOL_CPU_NAME="i686"
#TOOL_PREFIX="$TOOLCHAIN/bin/${TOOL_CPU_NAME}-linux-android"
#OPTIMIZE_CFLAGS="-march=i686 -mtune=intel -mssse3 -mfpmath=sse -m32"

# x86_64,这个指令集最低支持api21
# OUTPUT_FOLDER="x86_64"
# ARCH="x86_64"
# CPU="x86_64"
# TOOL_CPU_NAME="x86_64"
# TOOL_PREFIX="$TOOLCHAIN/bin/${TOOL_CPU_NAME}-linux-android"
# OPTIMIZE_CFLAGS="-march=$CPU" 


# 输出目录 
PREFIX="${PWD}/android/$OUTPUT_FOLDER" 
# so的输出目录, --libdir=$LIB_DIR 可以不用指定,默认会生成在$PREFIX/lib目录中
#LIB_DIR="${PWD}/android/libs/$OUTPUT_FOLDER" 

# 编译器 
CC="${TOOL_PREFIX}${API}-clang"
CXX="${TOOL_PREFIX}${API}-clang++"

# 执行 configure 脚本生成 Makefile 构建脚本
./configure \
--prefix=$PREFIX \
--disable-programs \
--disable-avdevice \
--enable-gpl \
--enable-libx264 \
--enable-cross-compile \
--cc=$CC \
--cxx=$CXX \
--sysroot=$SYSROOT \
--extra-cflags="$OPTIMIZE_CFLAGS" \
--arch=$ARCH \
--target-os=android

# 清除之前的编译内容
make clean

# 开启新的 FFMPEG 编译
make install

(1) .build_ffmpeg.sh (windows)

#!/bin/bash
#未开启硬件编码
# 清空上次的编译
make clean

#你自己的NDK路径.
export NDK=/D/java/ff/ndk/android-ndk-r21e

function build() {
  echo "Compiling FFmpeg for $CPU"
  ./configure \
    --prefix="$PREFIX" \
    --libdir="$LIB_DIR" \
    --enable-small \
    --enable-shared \
    --enable-static \
	  --enable-jni \
    --disable-asm \
    --disable-programs \
    --disable-avdevice \
    --disable-encoders \
    --disable-muxers \
    --disable-filters \
    --enable-cross-compile \
    --cross-prefix="$CROSS_PREFIX" \
    --cc="$CC" \
    --cxx="$CXX" \
    --sysroot="$SYSROOT" \
    --extra-cflags="-O3 -fpic $OPTIMIZE_CFLAGS" \
    --extra-ldflags="-O3 -fpic $OPTIMIZE_CFLAGS" \
    --arch="$ARCH" \
    --target-os=android

  make clean
  make
  make install
  echo "The Compilation of FFmpeg for $CPU is completed"
}

#function build_shared() {
#  make clean
#  $CC "$C_FLAGS" -shared -o libffmpeg.so -Wl,--whole-archive libavcodec.a libavformat.a libswresample.a libavfilter.a libavutil.a libswscale.a -Wl,--no-whole-archive
#}

# 编译工具链目录,ndk17版本以上用的是clang,以下是gcc
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/windows-x86_64
# 版本号
API=21
# 交叉编译树的根目录(查找相应头文件和库用)
SYSROOT="${TOOLCHAIN}/sysroot"

#ADDI_CFLAGS="-fPIE -pie -march=armv7-a -mfloat-abi=softfp -mfpu=neon"
ADDI_LDFLAGS="-fPIE -pie"

#armv7-a
OUTPUT_FOLDER="armeabi-v7a"
ARCH="arm"
CPU="armv7-a"
PREFIX="${PWD}/android/$OUTPUT_FOLDER"
LIB_DIR="$PREFIX/libs"
CC=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang
CXX=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang++
CROSS_PREFIX=$TOOLCHAIN/bin/arm-linux-androideabi-
OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU "

#armv8-a
#OUTPUT_FOLDER="arm64-v8a"
#ARCH=arm64
#CPU=armv8-a
#PREFIX="${PWD}/android/$OUTPUT_FOLDER"
#LIB_DIR="$PREFIX/libs"
#CC=$TOOLCHAIN/bin/aarch64-linux-android$API-clang
#CXX=$TOOLCHAIN/bin/aarch64-linux-android$API-clang++
#CROSS_PREFIX=$TOOLCHAIN/bin/aarch64-linux-android-
#OPTIMIZE_CFLAGS="-march=$CPU"

#x86 针对x86需要设置--disable-asm \,不然运行时会报错:“文件中有重定位”
#OUTPUT_FOLDER="x86"
#ARCH=x86
#CPU=x86
#PREFIX="${PWD}/android/$OUTPUT_FOLDER"
#LIB_DIR="$PREFIX/libs"
#CC=$TOOLCHAIN/bin/i686-linux-android$API-clang
#CXX=$TOOLCHAIN/bin/i686-linux-android$API-clang++
#CROSS_PREFIX=$TOOLCHAIN/bin/i686-linux-android-
#OPTIMIZE_CFLAGS="-march=i686 -mtune=intel -mssse3 -mfpmath=sse -m32"

#C_FLAGS="--sysroot=/root/NDK/android-ndk-r17c/platforms/android-21/arch-arm -isystem /root/NDK/android-ndk-r17c/sysroot/usr/include -isystem /root/NDK/android-ndk-r17c/sysroot/usr/include/arm-linux-androideabi"

#x86_64
#OUTPUT_FOLDER="x86_64"
#ARCH=x86_64
#CPU=x86_64
#PREFIX="${PWD}/android/$OUTPUT_FOLDER"
#LIB_DIR="$PREFIX/libs"
#CC=$TOOLCHAIN/bin/x86_64-linux-android$API-clang
#CXX=$TOOLCHAIN/bin/x86_64-linux-android$API-clang++
#CROSS_PREFIX=$TOOLCHAIN/bin/x86_64-linux-android-
#OPTIMIZE_CFLAGS="-march=$CPU -msse4.2 -mpopcnt -m64 -mtune=intel"

build
#build_shared

(2) .merge_static_to_share.sh (windows)

function merge_static_to_share() {
  "${CROSS_PREFIX}"ld \
  -rpath-link="$SYSROOT"/usr/lib \
  -L"$SYSROOT"/usr/lib \
  -soname libffmpeg.so -shared -Bsymbolic --whole-archive -o \
  "$PREFIX"/lib/libffmpeg.so \
  "$PREFIX"/lib/libavcodec.a \
  "$PREFIX"/lib/libavfilter.a \
  "$PREFIX"/lib/libswresample.a \
  "$PREFIX"/lib/libavformat.a \
  "$PREFIX"/lib/libavutil.a \
  "$PREFIX"/lib/libswscale.a \
  -lstdc++ -fPIC -lc -lm -lz -ldl -llog --dynamic-linker=/system/bin/linker \
  "$CROSS_GCC_LIB"/libgcc.a
}
export NDK=/D/java/ff/ndk/android-ndk-r21e
HOST_OS_ARCH=windows-x86_64

TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/windows-x86_64
SYSROOT="${TOOLCHAIN}/sysroot"
OUTPUT_FOLDER="x86"

PREFIX="${PWD}/android/$OUTPUT_FOLDER"

TOOLCHAIN_PATH=$NDK/toolchains/x86-4.9/prebuilt/$HOST_OS_ARCH
TOOLCHAIN_PREFIX=i686-linux-android

CROSS_PREFIX=$TOOLCHAIN_PATH/bin/$TOOLCHAIN_PREFIX-
CROSS_GCC_LIB=$TOOLCHAIN_PATH/lib/gcc/$TOOLCHAIN_PREFIX/4.9.x

merge_static_to_share
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值