为Android编译FFMpeg

  • 新建:build_android.sh
#!/bin/bash

# NDK途径 
export NDK=/Users/lucius/Library/Android/sdk/ndk-bundle 
# NDK东西链 
export PREBUILT=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt 
# 编译平台 
export PLATFORM=$NDK/platforms/android-14/arch-arm 
# 编译功效输入途径 
export PREFIX=/Users/lucius/development/workspaces/target/ffmpeg/optimized 
# 设置编译功效运转平台 
CPU=arm 
ARCH=arm # -marm -mthumb gcc编译器参数 
# marm功能优于mthumb百分之10到15,mthumb兼容性更好,可以调试用marm,发版用mthumb ADDI_CFLAGS="-marm" 
# 开端编译设置 
./configure / 
# 设置输入途径 
--prefix=$PREFIX / 
# 设置编纂功效目的运转零碎 
--target-os=android / 
# 设置编译效果cpu架构 
--arch=$ARCH / 
# 设置编译效果运转平台 
--sysroot=$PLATFORM / 
# 交织编译东西链 
--cross-prefix=$PREBUILT/darwin-x86_64/bin/arm-linux-androideabi- / 
# gcc编译参数 
--extra-ldflags="$ADDI_LDFLAGS" / 
# 从编译参数 
--extra-cflags="-Os -fpic $ADDI_CFLAGS" / 
# 紧缩编译 --enable-small / 
# 运用GPL,!!!GPL!!! 
--enable-gpl / 
# 多线程编解码 
--enable-pthreads / 
# 禁用文档 --disable-doc / 
# 禁用ffmpeg下令,android会有本身的出口 
--disable-ffmpeg / 
# 禁用ffplay下令,android不须要 
--disable-ffplay / 
# 禁用ffprobe下令,android不须要 
--disable-ffprobe / 
# 禁用ffserver下令,android不须要 
--disable-ffserver / 
# 禁用network,android不须要 -
-disable-network / 
# 禁用ffplay下令,android不须要 
--disable-shared / 
# 禁用一切编解码器,今后再按照需求增加编解码器 
--disable-encoders / 
--disable-decoders / 
#编解码传输和谈 
--enable-protocols / 
# 滤镜处置 
--enable-filters / 
# 开启mp4音视频相干的编解码器 
--enable-decoder=mpeg4 / 
--enable-decoder=h264 / 
--enable-decoder=mp3 / 
--enable-decoder=aac / 
--enable-encoder=mpeg4 / 
--enable-encoder=libx264 / 
--enable-encoder=aac / 
# 未知选项 
$ADDITIONAL_CONFIGURE_FLAG 
# 清空前次编纂 
make clean 
# 开端四核编译 -j2暗示双核 
make -j4 
# 输入编译效果到指定目次 
make install 
# 以下脚本暗示将分离的so库合并成一个libffmpeg.so,详细指令寄义待研究 
$PREBUILT/darwin-x86_64/bin/arm-linux-androideabi-ld / 
-rpath-link=$PLATFORM/usr/lib / 
-L$PLATFORM/usr/lib / 
-L$PREFIX/lib / 
-soname libffmpeg.so 
-shared 
-nostdlib 
-Bsymbolic 
--whole-archive 
--no-undefined 
-o / 
$PREFIX/libffmpeg.so / 
libavcodec/libavcodec.a / 
libavformat/libavformat.a / 
libavutil/libavutil.a / 
libavfilter/libavfilter.a / 
libavdevice/libavdevice.a / 
libpostproc/libpostproc.a / 
libswresample/libswresample.a / 
libswscale/libswscale.a / 
-lc 
-lm 
-lz 
-ldl 
-llog 
--dynamic-linker=/system/bin/linker / 
$PREBUILT/darwin-x86_64/lib/gcc/arm-linux-androideabi/4.9.x/libgcc.a 
$PREBUILT/darwin-x86_64/bin/arm-linux-androideabi-strip 
$PREFIX/libffmpeg.so  
  • 需要修改下 ffmpeg/configure,使导出的so库文件名称符合NDK的规范

SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'
LIB_INSTALL_EXTRA_CMD='$$(RANLIB)"$(LIBDIR)/$(LIBNAME)"'
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'
SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR)$(SLIBNAME)'

修改为:

SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
LIB_INSTALL_EXTRA_CMD='$$(RANLIB)"$(LIBDIR)/$(LIBNAME)"'
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
SLIB_INSTALL_LINKS='$(SLIBNAME)'
#!/bin/sh

#!/bin/sh

CPU=armeabi-v7a
PREFIX=$(pwd)/output/$CPU
NDK_HOME=/Users/eraise/Library/Android/ndk
ANDROID_API=android-23
SYSROOT=$NDK_HOME/platforms/$ANDROID_API/arch-arm
ANDROID_BIN=$NDK_HOME/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin/
CROSS_COMPILE=${ANDROID_BIN}arm-linux-androideabi-
ARM_INC=$SYSROOT/usr/include 
ARM_LIB=$SYSROOT/usr/lib
LDFLAGS=" -nostdlib -Bdynamic -Wl,--whole-archive -Wl,--no-undefined -Wl,-z,noexecstack  -Wl,-z,nocopyreloc -Wl,-soname,/system/lib/libz.so -Wl,-rpath-link=$ARM_LIB,-dynamic-linker=/system/bin/linker -L$NDK_HOME/sources/cxx-stl/gnu-libstdc++/4.9/libs/$CPU -L$NDK_HOME/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/arm-linux-androideabi/lib -L$ARM_LIB  -lc -lgcc -lm -ldl  "
FLAGS="--host=arm-androideabi-linux --enable-static --disable-shared"
export CXX="${CROSS_COMPILE}g++ --sysroot=${SYSROOT}"
export LDFLAGS="$LDFLAGS"
export CC="${CROSS_COMPILE}gcc --sysroot=${SYSROOT}"

./configure $FLAGS \
--prefix=$PREFIX

make clean 
make -j4
make install
需要注意,脚本中的./configure 如果分行写,"\"右边不能再有空格,否则报configure: error: /bin/sh build/config.sub failed

  • 错误:
error: undefined reference to 'av_register_all()'
error: undefined reference to 'avcodec_register_all()'
error: undefined reference to 'avformat_network_init()'

解决方案是把 ffmpeg 的头文件用extern "C" 包起来
(方案来源:贝壳博客):

extern "C" {

#include <libavformat/avformat.h>
#include <libavutil/imgutils.h>

build_android.sh来源

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

推荐阅读更多精彩内容