ffmpeg+x264+fdk-aac+lame编译

  • 背景
    https://www.jianshu.com/p/0f789641b2af
    上篇这个说道window下混编android的ffmpeg包,但是想接入x264,fdk-acc,lame还是需要注意很多细节的,x264是视频的编码包,fdk-acc是acc编码包,lame是mp3的编码包。步骤肯定是先编译每个模块成功后,才做整体的编译,不然直接整体编译,都不好调试
    那下面就分别和总体说明编译的脚本

  • 环境
    环境是在window下的bash环境,参照上方的链接,在window中搭建linux的子系统,然后访问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

要注意的是,下面两句要加上,因为我要用子模块的静态库编译去编译一个总的ffmepg.so动态库

    --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 中配置交叉混编的参数,而是通过设置环境变量的参数来做的,即设置一系列的环境变量

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配置环境变量的方式去编译脚本

  • ffmpeg编译脚本
    最后是总的ffmpeg的编译脚本,需要注意的是,设置上面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 \状态
总体脚本如下

#!/bin/bash
# 设置临时文件夹,需要提前手动创建
#export TMPDIR="/home/yangle/ffmpeg/ffmpeg-4.0/ffmpegtemp"
# 设置NDK路径 D:\IdeSDK\ndk\android-ndk-r14b-linux
NDK=/mnt/d/IdeSDK/ndk/android-ndk-r14b-linux
# 设置编译针对的平台,可以根据自己的需求进行设置
# 当前设置为最低支持android-14版本,arm架构
SYSROOT=$NDK/platforms/android-14/arch-arm/
# 设置编译工具链,4.9为版本号
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64

# 设置编译后的文件输出目录
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 \
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345