背景
http://www.reibang.com/p/0f789641b2af
上篇這個說道window下混編android的ffmpeg包,但是想接入x264,fdk-acc,lame還是需要注意很多細節(jié)的丸卷,x264是視頻的編碼包涕滋,fdk-acc是acc編碼包扭勉,lame是mp3的編碼包。步驟肯定是先編譯每個模塊成功后,才做整體的編譯,不然直接整體編譯静袖,都不好調(diào)試
那下面就分別和總體說明編譯的腳本環(huán)境
環(huán)境是在window下的bash環(huán)境,參照上方的鏈接俊扭,在window中搭建linux的子系統(tǒng)队橙,然后訪問window的硬盤空間可以/mnt/+硬盤,比如說D盤:/mnt/d/x264編譯
編譯的腳本:
#!/bin/bash
NDK=/mnt/d/IdeSDK/ndk/android-ndk-r14b-linux
SYSROOT=$NDK/platforms/android-14/arch-arm/
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
CPU=armv7-a
PREFIX=$(pwd)/android/$CPU
ADDI_CFLAGS=""
ADDI_LDFLAGS=""
function build_x264
{
./configure \
--prefix=$PREFIX \
--disable-asm \
--enable-static \
--enable-shared \
--enable-pic \
--enable-strip \
--host=arm-linux-androideabi \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--sysroot=$SYSROOT
--extra-cflags="-Os -fpic $ADDI_CFLAGS $OPTIMIZE_CFLAGS" \
--extra-ldflags="$ADDI_LDFLAGS" \
$ADDITIONAL_CONFIGURE_FLAG
make clean
make
make install
}
build_x264
要注意的是,下面兩句要加上萨惑,因為我要用子模塊的靜態(tài)庫編譯去編譯一個總的ffmepg.so動態(tài)庫
--extra-cflags="-Os -fpic $ADDI_CFLAGS $OPTIMIZE_CFLAGS" \
--extra-ldflags="$ADDI_LDFLAGS" \
- fdk-acc 編譯
#!/bin/bash
NDK=/mnt/d/IdeSDK/ndk/android-ndk-r14b-linux
SYSROOT=$NDK/platforms/android-14/arch-arm/
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
CPU=armv7-a
PREFIX=$(pwd)/android/$CPU
PLATFORM=$NDK/platforms/android-14/arch-arm
CROSS_COMPILE=$TOOLCHAIN/bin/arm-linux-androideabi-
CFLAGS=""
FLAGS="--enable-static --host=$HOST --target=android --disable-asm "
export CXX="${CROSS_COMPILE}g++ --sysroot=${SYSROOT}"
export LDFLAGS=" -L$SYSROOT/usr/lib $CFLAGS "
export CXXFLAGS=$CFLAGS
export CFLAGS=$CFLAGS
export CC="${CROSS_COMPILE}gcc --sysroot=${SYSROOT}"
export AR="${CROSS_COMPILE}ar"
export LD="${CROSS_COMPILE}ld"
export AS="${CROSS_COMPILE}gcc"
function build_acc
{
./configure \
--prefix=$PREFIX \
--disable-asm \
--enable-static \
--enable-shared \
--target=android \
--enable-pic \
--enable-strip \
--host=arm-linux-androideabi \
$ADDITIONAL_CONFIGURE_FLAG
make clean
make
make install
}
build_acc
編譯acc的時候捐康,花了好多時間,因為它跟x264的編譯方式不是一門路庸蔼,不用在configure 中配置交叉混編的參數(shù)解总,而是通過設(shè)置環(huán)境變量的參數(shù)來做的,即設(shè)置一系列的環(huán)境變量
export LDFLAGS=" -L$SYSROOT/usr/lib $CFLAGS "
export CXXFLAGS=$CFLAGS
export CFLAGS=$CFLAGS
...
- lame編譯
#!/bin/bash
NDK=/mnt/d/IdeSDK/ndk/android-ndk-r14b-linux
SYSROOT=$NDK/platforms/android-14/arch-arm/
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
HOME=$(dirname "$PWD")
CPU=armv7-a
PREFIX=$(pwd)/android/$CPU
CROSS_PREFIX=$TOOLCHAIN/bin/arm-linux-androideabi-
export CC="${CROSS_PREFIX}gcc --sysroot=${SYSROOT}"
export LD="${CROSS_PREFIX}ld"
export RANLIB="${CROSS_PREFIX}ranlib"
export STRIP="${CROSS_PREFIX}strip"
export READELF="${CROSS_PREFIX}readelf"
export OBJDUMP="${CROSS_PREFIX}objdump"
export ADDR2LINE="${CROSS_PREFIX}addr2line"
export AR="${CROSS_PREFIX}ar"
export AS="${CROSS_PREFIX}as"
export CXX="${CROSS_PREFIX}g++"
export OBJCOPY="${CROSS_PREFIX}objcopy"
export ELFEDIT="${CROSS_PREFIX}elfedit"
export CPP="${CROSS_PREFIX}cpp --sysroot=${SYSROOT}"
export DWP="${CROSS_PREFIX}dwp"
export GCONV="${CROSS_PREFIX}gconv"
export GDP="${CROSS_PREFIX}gdb"
export GPROF="${CROSS_PREFIX}gprof"
export NM="${CROSS_PREFIX}nm"
export SIZE="${CROSS_PREFIX}size"
export STRINGS="${CROSS_PREFIX}strings"
function build_lame
{
./configure \
--with-pic \
--prefix=$PREFIX \
--bindir="$HOME/bin" \
--enable-nasm \
--enable-static \
--enable-shared \
--host=arm-linux \
--with-sysroot=$SYSROOT
$ADDITIONAL_CONFIGURE_FLAG
#make clean
#make
#make install
}
build_lame
這句代碼記得加上朱嘴,--bindir="$HOME/bin" \,另外lame跟acc編譯方案類似,采用export配置環(huán)境變量的方式去編譯腳本
- ffmpeg編譯腳本
最后是總的ffmpeg的編譯腳本萍嬉,需要注意的是乌昔,設(shè)置上面x264,acc,lame的頭文件和外部包地址:
--extra-cflags="-I$FDK_INCLUDE -I$X264_INCLUDE -I$LAME_INCLUDE" \
--extra-ldflags="-L$FDK_LIB -L$X264_LIB -L$LAME_LIB" \
這樣才能識別到子模塊編譯的包,打開--enable-gpl \狀態(tài)
總體腳本如下
#!/bin/bash
# 設(shè)置臨時文件夾壤追,需要提前手動創(chuàng)建
#export TMPDIR="/home/yangle/ffmpeg/ffmpeg-4.0/ffmpegtemp"
# 設(shè)置NDK路徑 D:\IdeSDK\ndk\android-ndk-r14b-linux
NDK=/mnt/d/IdeSDK/ndk/android-ndk-r14b-linux
# 設(shè)置編譯針對的平臺磕道,可以根據(jù)自己的需求進行設(shè)置
# 當(dāng)前設(shè)置為最低支持android-14版本,arm架構(gòu)
SYSROOT=$NDK/platforms/android-14/arch-arm/
# 設(shè)置編譯工具鏈行冰,4.9為版本號
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
# 設(shè)置編譯后的文件輸出目錄
CPU=armv7-a
PREFIX=$(pwd)/android/$CPU
#lix264和libfdk_acc庫地址(ffmpeg目錄)
LIBS_DIR=$(dirname "$PWD")
#默認路徑-L/usr/local/lib
X264_INCLUDE=$LIBS_DIR/x264/android/$CPU/include
X264_LIB=$LIBS_DIR/x264/android/$CPU/lib
FDK_INCLUDE=$LIBS_DIR/fdk-aac-016/android/$CPU/include
FDK_LIB=$LIBS_DIR/fdk-aac-016/android/$CPU/lib
#libmp3lame
LAME_INCLUDE=$LIBS_DIR/lame-3.99.5/android/$CPU/include
LAME_LIB=$LIBS_DIR/lame-3.99.5/android/$CPU/lib
function build_one
{
./configure \
--arch=arm \
--enable-small \
--enable-cross-compile \
--disable-protocols \
--enable-protocol=file \
--enable-protocol=concat \
--disable-filters \
--enable-filter=aresample \
--enable-filter=asetpts \
--enable-filter=setpts \
--enable-filter=ass \
--enable-filter=scale \
--enable-filter=concat \
--enable-filter=atempo \
--enable-filter=movie \
--enable-filter=overlay \
--enable-filter=rotate \
--enable-filter=transpose \
--enable-filter=hflip \
--enable-filter=amix \
--enable-filter=fade \
--enable-filter=afade \
--enable-filter=areverse \
--enable-filter=volume \
--enable-filter=aevalsrc \
--enable-filter=adelay \
--disable-encoders \
--enable-encoder=libx264 \
--enable-encoder=libfdk_aac \
--enable-encoder=aac \
--enable-encoder=libmp3lame \
--enable-encoder=mjpeg \
--enable-encoder=mpeg4 \
--enable-encoder=rawvideo \
--enable-encoder=png \
--enable-encoder=gif \
--disable-decoders \
--enable-decoder=rawvideo \
--enable-decoder=mjpeg \
--enable-decoder=mpeg4 \
--enable-decoder=h264 \
--enable-decoder=aac \
--enable-decoder=mp3 \
--enable-decoder=aac_latm \
--enable-decoder=gif \
--enable-decoder=png \
--enable-decoder=pcm_f16le \
--enable-decoder=pcm_f24le \
--enable-decoder=pcm_f32be \
--enable-decoder=pcm_f32le \
--enable-decoder=pcm_f64be \
--enable-decoder=pcm_f64le \
--enable-decoder=libfdk_aac \
--disable-muxers \
--enable-muxer=mov \
--enable-muxer=mp4 \
--enable-muxer=mp3 \
--enable-muxer=h264 \
--enable-muxer=mpjpeg \
--enable-muxer=rawvideo \
--enable-muxer=wav \
--enable-muxer=mpegts \
--enable-muxer=dts \
--enable-muxer=gif \
--enable-muxer=flv \
--disable-demuxers \
--enable-demuxer=mov \
--enable-demuxer=h264 \
--enable-demuxer=aac \
--enable-demuxer=mp3 \
--enable-demuxer=rawvideo \
--enable-demuxer=avi \
--enable-demuxer=wav \
--enable-demuxer=flv \
--enable-demuxer=gif \
--enable-demuxer=ogg \
--enable-demuxer=dts \
--enable-demuxer=m4v \
--enable-demuxer=concat \
--enable-demuxer=mpegts \
--enable-demuxer=mjpeg \
--disable-parsers \
--enable-parser=aac \
--enable-parser=h264 \
--enable-parser=mpeg4video \
--enable-parser=mjpeg \
--enable-parser=ac3 \
--enable-parser=png \
--enable-parser=mpegaudio \
--enable-zlib \
--disable-shared \
--enable-static \
--enable-version3 \
--enable-pthreads \
--disable-network \
--enable-nonfree \
--disable-vda \
--disable-iconv \
--disable-outdevs \
--enable-asm \
--enable-neon \
--enable-runtime-cpudetect \
--enable-gpl \
--enable-libx264 \
--enable-libfdk-aac \
--enable-libmp3lame \
--enable-nonfree \
--extra-cflags="-I$FDK_INCLUDE -I$X264_INCLUDE -I$LAME_INCLUDE" \
--extra-ldflags="-L$FDK_LIB -L$X264_LIB -L$LAME_LIB" \
--enable-jni \
--enable-mediacodec \
--disable-debug \
--enable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-ffserver \
--disable-postproc \
--enable-avdevice \
--disable-stripping \
--disable-doc \
--disable-symver \
--prefix=$PREFIX \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--target-os=android \
--cpu=$CPU \
--sysroot=$SYSROOT \
--bindir="$LIBS_DIR/bin" \
--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 -O3 -Wall -pipe -ffast-math -fstrict-aliasing -Werror=strict-aliasing -Wno-psabi -Wa,--noexecstack -DANDROID " \
$ADDITIONAL_CONFIGURE_FLAG
make clean
make
make install
}
build_one
$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 \
$X264_LIB/libx264.a \
$FDK_LIB/libfdk-aac.a \
$LAME_LIB/libmp3lame.a \
libavutil/libavutil.a \
libswscale/libswscale.a \
libavdevice/libavdevice.a \
libpostproc/libpostproc.a \
-lc -lm -lz -ldl -llog --dynamic-linker=/system/bin/linker \
$TOOLCHAIN/lib/gcc/arm-linux-androideabi/4.9.x/libgcc.a \