FFmpeg+fdk-aac+x264編譯成單個 ffmpeg.so

我是在 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

直接貼編譯腳本(腳本也是綜合網上的 0.0)

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

參考

劍西的博客 文章
雷神的博客 文章shell

相關文章
相關標籤/搜索