我是在 WSL下編譯的。試了好幾個版本都會出現各類問題,最後參考 他的 版本才編譯經過,他也是試了好多個版本最後找出來這個組合。。html
庫名 | 版本 | 下載地址 |
---|---|---|
FFmpeg | 4.0 | ffmpeg.org/releases/ff… |
X264 | x264-snapshot-20180212-2245-stable | download.videolan.org/x264/snapsh… |
fdk-aac | 0.1.6 | jaist.dl.sourceforge.net/project/ope… |
ndk | android-ndk-r10e-linux-x86_64 | dl.google.com/android/rep… |
mmpeg4.0
├── fdk-aac-0.1.6
├── x264linux
x264 的編譯腳本,直接放到 x264 的根目錄android
#!/bin/sh
# ndk10e
# 這裏要換成本身的 ndk 路徑
NDK=/mnt/d/wsl/android-ndk-r10e
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
API="android-21"
SYSROOT=$NDK/platforms/$API/arch-arm
# armv7a
CPU="armv7a"
TOOL_CPU_NAME=armv7a
HOST="arm-linux-androideabi"
TOOL_PREFIX="$TOOLCHAIN/bin/${HOST}"
TOOLNAME_BASE="arm-linux-androideabi"
PREFIX=./android/$CPU
export CC="${TOOL_PREFIX}-gcc"
export CXX="${TOOL_PREFIX}-c++"
./configure --prefix=$PREFIX \
--enable-static \
--enable-pic \
--disable-asm \
--enable-strip \
--disable-opencl \
--disable-cli \
--host=$HOST \
--cross-prefix=$TOOLCHAIN/bin/$TOOLNAME_BASE- \
--sysroot=$SYSROOT \
--extra-cflags="-Os -fpic" \
--extra-ldflags="" \
$ADDITIONAL_CONFIGURE_FLAG
make clean
make -j4
make install
複製代碼
fdk-aac 的編譯腳本,fdk-aac 編譯的時候編譯器要設置成 環境變量c++
#!/bin/sh
# ndk10e
NDK=/mnt/d/wsl/android-ndk-r10e
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
API="android-21"
SYSROOT=$NDK/platforms/$API/arch-arm
# armv7a
CPU=armv7a
HOST="arm-linux-androideabi"
TOOLNAME_BASE="arm-linux-androideabi"
COMPILER_BASE="armv7a-linux-androideabi"
# 交叉編譯路徑
CROSS_PREFIX="$TOOLCHAIN/bin/$TOOLNAME_BASE"
CC="${CROSS_PREFIX}-gcc"
CXX="${CROSS_PREFIX}-c++"
AR="${CROSS_PREFIX}-ar"
LD="${CROSS_PREFIX}-ld"
AS="${CROSS_PREFIX}-as"
basepath=$(cd `dirname $0`; pwd)
echo "$basepath"
# fdk-aac 配置
# ./configure --prefix=${basepath}/android/$CPU --disable-static && make
CFLAGS=""
# FLAGS="--enable-static --host=${HOST} --target=android "
export CXX="${CXX} --sysroot=${SYSROOT}"
export LDFLAGS=" -L$SYSROOT/usr/lib $CFLAGS "
export CXXFLAGS=$CFLAGS
export CFLAGS=$CFLAGS
export CC="${CC} --sysroot=${SYSROOT}"
export AR="${AR}"
export LD="${LD}"
export AS="${AS}"
./configure \
--prefix=${basepath}/android/$CPU \
--enable-static \
--enable-shared \
--enable-pic \
--enable-strip \
--host=${HOST} \
--target=android
$ADDITIONAL_CONFIGURE_FLAG
make clean
make -j16
make install
複製代碼
FFmpeg 的編譯腳本,這裏是直接把各個模塊合併編譯成一個 ffmpeg.so 文件git
#!/bin/bash
basepath=$(cd `dirname $0`; pwd)
export TMPDIR=$basepath/ffmpegtemp
# echo "$basepath"
# 輸出目錄
PREFIX=./android/$OUTPUT_FOLDER
# armv7-a
LIB_CPU=armv7a
OUTPUT_FOLDER=armeabi-v7a
ARCH=arm
CPU=armv7-a
TOOLNAME_BASE="arm-linux-androideabi"
# ndk10e
NDK=/mnt/d/wsl/android-ndk-r10e
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
API="android-21"
SYSROOT=$NDK/platforms/$API/arch-arm
TOOL_CPU_NAME=arm
TOOL_PREFIX="$TOOLCHAIN/bin/${TOOL_CPU_NAME}-linux-androideabi"
# 編譯器
CC="${TOOL_PREFIX}-gcc"
CXX="${TOOL_PREFIX}-c++"
# 交叉編譯路徑
CROSS_PREFIX="$TOOLCHAIN/bin/$TOOLNAME_BASE-"
# OPTIMIZE_CFLAGS="-march=$CPU"
ONE_SO=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
FDK_INCLUDE=$basepath/fdk-aac-0.1.6/android/$LIB_CPU/include
FDK_LIB=$basepath/fdk-aac-0.1.6/android/$LIB_CPU/lib
X264_INCLUDE=$basepath/x264/android/$LIB_CPU/include
X264_LIB=$basepath/x264/android/$LIB_CPU/lib
FF_EXTRA_CFLAGS="-DANDROID -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 "
FF_CFLAGS="-O3 -Wall -pipe \
-ffast-math \
-fstrict-aliasing -Werror=strict-aliasing \
-Wno-psabi -Wa,--noexecstack \
-DANDROID "
echo "開始編譯ffmpeg"
# 定義執行configure的shell方法
./configure \
--prefix=$PREFIX \
--enable-cross-compile \
--disable-runtime-cpudetect \
--enable-small \
--disable-doc \
--disable-htmlpages \
--disable-manpages \
--disable-podpages \
--disable-txtpages \
--disable-programs \
--disable-asm \
--arch=$ARCH \
--target-os=android \
--cc=$CC \
--cxx=$CXX \
--cross-prefix=$CROSS_PREFIX \
--nm=$TOOLCHAIN/bin/arm-linux-androideabi-nm \
--sysroot=$SYSROOT \
--extra-cflags="-I$X264_INCLUDE -I$FDK_INCLUDE " \
--extra-ldflags="-L$FDK_LIB -L$X264_LIB" \
--enable-gpl \
--disable-shared \
--enable-static \
--enable-version3 \
--enable-pthreads \
--enable-neon \
--enable-yasm \
--enable-libx264 \
--enable-libfdk_aac \
--disable-encoders \
--enable-encoder=aac \
--enable-encoder=libx264 \
--enable-encoder=libfdk_aac \
--enable-encoder=mjpeg \
--enable-encoder=png \
--enable-jni \
--cpu=$CPU \
--enable-nonfree \
--enable-muxers \
--enable-muxer=mov \
--enable-muxer=mp4 \
--enable-muxer=h264 \
--disable-decoders \
--enable-decoder=aac \
--enable-decoder=aac_latm \
--enable-decoder=h264 \
--enable-decoder=mpeg4 \
--enable-decoder=mjpeg \
--enable-decoder=png \
--disable-demuxers \
--enable-demuxer=image2 \
--enable-demuxer=h264 \
--enable-demuxer=aac \
--enable-demuxer=avi \
--enable-demuxer=mpc \
--enable-demuxer=mpegts \
--enable-demuxer=mov \
--disable-parsers \
--enable-parser=aac \
--enable-parser=ac3 \
--enable-parser=h264 \
--enable-protocols \
--enable-zlib \
--enable-avfilter \
--disable-outdevs \
--disable-ffprobe \
--disable-ffplay \
--disable-ffmpeg \
--disable-debug \
--disable-postproc \
--disable-avdevice \
--disable-symver \
--disable-stripping \
--extra-cflags="$FF_EXTRA_CFLAGS $FF_CFLAGS" \
--extra-ldflags=" "
# --extra-cflags="-Os -fpic $OPTIMIZE_CFLAGS" \
# $COMMON_FF_CFG_FLAGS
make clean
make -j8
make install
# cp $FDK_LIB/libfdk-aac.so $PREFIX/lib
echo "編譯完成ffmpeg"
echo "開始編譯ffmpeg so"
$TOOLCHAIN/bin/arm-linux-androideabi-ld \ -rpath-link=$SYSROOT/usr/lib \ -L$SYSROOT/usr/lib \ -L$PREFIX/lib \ -soname libffmpeg.so -shared -nostdlib -Bsymbolic --whole-archive --no-undefined -o \ $PREFIX/libffmpeg.so \ libavcodec/libavcodec.a \ libavfilter/libavfilter.a \ libswresample/libswresample.a \ libavformat/libavformat.a \ libavutil/libavutil.a \ libswscale/libswscale.a \ $X264_LIB/libx264.a \ $FDK_LIB/libfdk-aac.a \ -lc -lm -lz -ldl -llog --dynamic-linker=/system/bin/linker \ $TOOLCHAIN/lib/gcc/arm-linux-androideabi/4.9/libgcc.a \
echo "完成編譯ffmpeg so"
複製代碼
腳本有點亂,可是好用 [笑哭]。github