Linux下使用NDK编译FFMPEG(libstagefright)
这个月要负责一个项目,使用FFMPEG渲染视频,主要是Android端的,由于性能要求,要使用硬解码,但网上大多数教程都是没有libstagefright的,所以个人觉得,生成的so库文件也是没有开启libstagefright硬解码,于是自己去编译一次,期间遇到的所有坑,都记录下来,为了不再重蹈覆辙!
- 编译环境:Ubuntu14.04+NDK-r9+FFMPEG2.8.6 (环境需各位自行下载配置,下载最新版的应该也没问题)
- 编译libstagefright还要安装git
sudo apt-get install git
- Ubuntu的安装和配置就不说了,NDK的配置也略过了(不配置也行,解压就OK了),解压FFMPEG这个应该也没问题,路径可以随便设置,记住就好
- 下载update-cm-7.0.3-N1-signed.zip,并放到FFMPEG文件夹的上一层目录,不用解压
- 修改FFMPEG目录下的configure文件,将enabled libstagefright_h264 && require_cpp libstagefright_h264 改为 enabled libstagefright && require_cpp libstagefright_h264,否则会出现ERROR: libstagefright_h264 not found
- 还是修改FFMPEG目录下的configure文件,如下
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)' - 在解压后的FFMPEG目录添加 *.sh 脚本文件,命名也是随便,本例就命名为“config_android.sh”,并把以下脚本复制到config_android.sh中
#!/bin/bash
export NDK=/opt/android/android-ndk-r9
SYSROOT=$NDK/platforms/android-/arch-arm/
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64 git clone --depth= --branch gingerbread-release https://github.com/CyanogenMod/android_frameworks_base.git ../android-source/frameworks/base
git clone --depth= --branch gingerbread-release https://github.com/CyanogenMod/android_system_core.git ../android-source/system/core # Libraries from any froyo/gingerbread device/emulator should work
# fine, since the symbols used should be available on most of them.
if [ ! -d "../android-libs" ]; then
if [ ! -f "../update-cm-7.0.3-N1-signed.zip" ]; then
wget http://download.cyanogenmod.com/get/update-cm-7.0.3-N1-signed.zip -P../
fi
unzip ../update-cm-7.0.-N1-signed.zip system/lib/* -d../
mv ../system/lib ../android-libs
rmdir ../system
fi function build_one
{
./configure \
--prefix=$PREFIX \
--enable-shared \
--disable-static \
--enable-libstagefright-h264 \
--disable-doc \
--disable-ffserver \
--enable-cross-compile \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--target-os=linux \
--arch=arm \
--sysroot=$SYSROOT \
--extra-cflags="-Os -fpic $ADDI_CFLAGS $EXTRA_CFLAGS" \
--extra-ldflags="$ADDI_LDFLAGS $EXTRA_LDFLAGS" \
--extra-cxxflags="$EXTRA_CXXFLAGS" \
$ADDITIONAL_CONFIGURE_FLAG
} ANDROID_SOURCE=../android-source
ANDROID_LIBS=../android-libs
ABI="armeabi-v7a" EXTRA_CFLAGS="-I$ANDROID_SOURCE/frameworks/base/include -I$ANDROID_SOURCE/system/core/include"
EXTRA_CFLAGS="$EXTRA_CFLAGS -I$ANDROID_SOURCE/frameworks/base/media/libstagefright"
EXTRA_CFLAGS="$EXTRA_CFLAGS -I$ANDROID_SOURCE/frameworks/base/include/media/stagefright/openmax"
EXTRA_CFLAGS="$EXTRA_CFLAGS -I$NDK/sources/cxx-stl/gnu-libstdc++/4.8/include -I$NDK/sources/cxx-stl/gnu-libstdc++/4.8/libs/$ABI/include"
EXTRA_CFLAGS="$EXTRA_CFLAGS -march=armv7-a -mfloat-abi=softfp -mfpu=neon" EXTRA_LDFLAGS="-Wl,--fix-cortex-a8 -L$ANDROID_LIBS -Wl,-rpath-link,$ANDROID_LIBS -L$NDK/sources/cxx-stl/gnu-libstdc++/4.8/libs/$ABI -lstagefright -lstdc++ -lutils -lbinder -lgnustl_static -lgnustl_shared" EXTRA_CXXFLAGS="-Wno-multichar -fno-exceptions -fno-rtti" CPU=armeabi-v7a
PREFIX=$(pwd)/android/$CPU
ADDI_CFLAGS="-marm"
build_one
make clean
make -j4 || exit 1 - 修改FFMPEG目录下的libavcodec/libstagefright.cpp
!mate
替换为
mate != NULL 给build_android.sh 和 configure 增加可执行权限:
chmod+x ./build_android.shchmod+x ./configure
- 最后编译:
sudo ./config_android.sh
sudo make install - 编译完成后,会在FFMPEG中生成一个android目录,里面包含库文件和头文件等。
教程经过亲自实践,有任何问题,一起讨论,有任何错误,请指出。
参考资料:
ffmpeg2.2在ubuntu下使用NDK编译——并在android工程下测试使用
ffmpeg编译android 硬解码支持库 libstagefright
Linux下使用NDK编译FFMPEG(libstagefright)的更多相关文章
- FFmpeg编译:Linux下使用NDK编译FFmpeg
环境: Ubuntu 1.下载并解压FFmpeg3.4.zip(略) 2.将编译脚本放入到FFmpeg解压后的目录. 3.执行编译脚本: ./linux_build_android.sh linux_ ...
- Linux下NDK编译FFMPEG包含neon参数
FFMPEG编译成Android库已经有很多案例了,编译优化neon的也很多,以下是我通过实践成功的案例,这里主要讲编译的配置文件,其他设置可结合Linux下使用NDK编译FFMPEG(libstag ...
- NDK编译FFMpeg[Linux]
最近在研究视频直播相关的技术,了解到了FFmpeg,就在网上查看如何将FFmpeg移植到Android中,查了几天,看的东西不少,就是没有一个可以完全移植成功的,最后通过产看各种资料,结合网上的资料, ...
- ffmpeg2.2在ubuntu下使用NDK编译——并在android工程下测试使用
作者:wainiwann 出处:http://www.cnblogs.com/wainiwann/ 本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则 ...
- anroid ndk编译ffmpeg 引用librtmp libx264
Ffmpeg 无处不在,自然android系统少不了它,折腾了不少时间完成 ndk编译ffmpeg,生成so库中引用了外部库librtmp,libx264.条条大路通罗马, 也许还有别的更好的方法去完 ...
- 用Android NDK编译FFmpeg
附(2018-01-06): 有一个将x264及lame等库集成进去了且基于android的ffmpeg的编译方法,地址参见: https://github.com/writing ...
- 64位 CentOS NDK 编译 FFMPEG
64位 CentOS NDK 编译 FFMPEG 一. 参考文章: http://www.cnblogs.com/baopu/p/4733029.html http://www.c ...
- windows 7下mingw+msys编译ffmpeg
windows 7下mingw+msys编译ffmpeg 1-->下载安装MingW,mingw-get-inst-20120426.exe http://sourceforge.ne ...
- windows下用vs2010编译ffmpeg
转载自;http://q1q2q3q4q5q6ln.blog.163.com/blog/static/500794332014666536283/ (注意:请务必先阅读:七,后记补充:) ffmpeg ...
随机推荐
- 2016暑假多校联合---A Simple Chess
2016暑假多校联合---A Simple Chess Problem Description There is a n×m board, a chess want to go to the po ...
- 解析 csv文件 java ***最爱那水货
/** * csv文件解析 <br> * wx 微信明细数据 第1行是标题 ,最后2行 是总结 提取数据需要过滤<br> * zfb 支付宝明细数据 前4行 和最后4行是总结 ...
- 使用maven profile实现多环境可移植构建(转自CSDN)
使用maven profile实现多环境可移植构建 标签: maven profilemaven自动构建maven自动部署maven可移植构建持续集成 2014-04-25 23:37 26905人阅 ...
- CentOS添加路由表
CentOS下静态路由修改命令方法一:添加路由route add -net 192.168.0.0/24 gw 192.168.0.1route add -host 192.168.1.1 dev 1 ...
- Java异常的中断和恢复
中断:抛出一个异常类的实例而终止现有程序的执行:恢复:不是抛出一个异常类的实例,而是调用一个用于解决问题的方法或就地解决问题. 在Java中,对那些要调用方法的客户程序员,我们要通知他们可能从自己的方 ...
- 开源日志记录工具log4j
前言:当我们进行大的项目书写的时候或者我们选择维护程序的时候,想知道几点几时我们录入的数据有bug是那么我们就采用--------------------------->log4j记录日志的信息 ...
- DDD为何叫好不叫座?兼论DCI与业务分析的方法论
今天,仔细阅读了园子里面的一个朋友写的<一缕阳光:DDD(领域驱动设计)应对具体业务场景,如何聚焦 Domain Model(领域模型)?>(http://www.cnblogs.com/ ...
- Exif.js 读取图像的元数据
Exif.js 提供了 JavaScript 读取图像的原始数据的功能扩展,例如:拍照方向.相机设备型号.拍摄时间.ISO 感光度.GPS 地理位置等数据. 注意事项: EXIF 数据主要来自拍摄的照 ...
- 25佳漂亮的结婚邀请 & 婚礼请柬网站设计
互联网给我们的生活带来了巨大的变化,越来越多的事情可以通过网络完成.下面向大家分享一组结婚邀请网站以及婚礼请柬网站的设计案例,如果你也正想制作这样的网站,相信这些优秀案例能够带给你很大的帮助. 您可能 ...
- 【JavaScript】Write和Writeln的区别
目录结构: Write和Writeln的区别 如何查看Writeln的换行效果 参考文章 Write和Writeln的区别 Write不可以换行,Writeln可以换行. 如何查看Writeln的换行 ...