关于使用Android NDK编译ffmpeg
2014-06-14 19:38
543 查看
/article/4362671.html
由于项目需求,前两天在在ios项目中使用ffmpeg,写下了“关于ios中编译ffmpeg0.9.2库”,然后有朋友在咨询,如何编译最新版的ffmpeg,其实最新版的编译也差不多,只是看看最新版的改变如何,修改一些参数即可,同时又因为我需要将项目跨平台到android,所以这次又需要在android中使用ndk来编译ffmpeg。索性在android上就编译一个最新版的ffmpeg出来看看。
还是先说一下我的环境:
mac os x 10.7.4
Eclispe3.7
android-sdk-macosx
android-ndk-r7b
1:打开ffmpeg官网(http://ffmpeg.org/download.html),看到最新版是ffmpeg-0.10.3,直接就选择了一个最新版本的zip包下载,然后解压,得到ffmpeg-0.10.3文件夹。
因为在网上也看到很多文章用android
ndk来编译ffmpeg,但是整个编译和配置过程都很麻烦,并且大部分朋友反应,编译过程总是会出现很多错误,各种编译不成功的原因,这次我们就来个简单点儿的,但是需要确保android
ndk的版本在r5以上。原因请看android
ndk目录中的doc/STANDALONE-TOOLCHAIN.html文档,因为Android
ndk中的交叉工具链可以将一套完整的工具链从NDK里复制出来,不在和ndk放在一起,以后用复制出来的工具链提供的库和头文件来编译会更加方便。
2:从ndk中赋值一个交叉工具链,使用ndk中的make-standalone-toolchain工具。在中断执行如下命令:
$NDK/build/tools/make-standalone-toolchain.sh --platform=android-9 --install-dir=/Users/yarin/android-toolchain
如果环境变量中有ndk的tools目录,就不需要前面的$NDK/build/tools/目录了。
这样就会在制定的目录“/User/yarin”目录中产生一个android-toolchain文件夹,就是我们从ndk中分离出来的独立交叉工具链,其中的sysroot目录就包含了一些基本库和头文件。一会儿我们就会用它来编译ffmpeg。
其中有个参数--platform,做过android的都知道吧,用于制定api版本。
3:配置编译器
打开终端,进入第一步解压得到的ffmpeg-0.10.3目录,在其中输入如下命令:
$ export PATH=/User/yarin/android-toolchain/bin:$PATH
$ export CC=arm-linux-androideabi-gcc
$ export CXX=arm-linux-androideabi-g++
$ export CXXFLAGS="-lstdc++"
这些命令主要用于设置环境变量,在后期的编译过程中,就不需要在设置sysroot路径和CC了,而且还能够使用STL,异常,RTTI。当然了,你也可以不在这里设置,而在后期的./configure中去制定需要的路径。
3:配置编译ffmpeg的选项参数
这一步比较简单,需要什么就模块就打开什么模块,我项目中的需求配置如下:
./configure --prefix=/Users/yarin/android-toolchains --disable-doc --disable-ffmpeg --disable-ffplay --disable-ffserver --disable-avfilter --disable-devices --disable-debug --disable-encoders --enable-cross-compile --enable-decoders --enable-demuxer=mov --enable-demuxer=h264 --enable-protocol=file --enable-avformat --enable-avcodec --enable-decoder=rawvideo --enable-decoder=h264 --enable-decoder=mjpeg --enable-decoder=h263 --enable-decoder=mpeg4 --enable-parser=h264 --enable-zlib --enable-shared --enable-static --enable-pic --nm=arm-linux-androideabi-nm --sysroot=/Users/yarin/android-toolchains/sysroot --cc=arm-linux-androideabi-gcc --arch=arm --target-os=linux --cross-prefix=arm-linux-androideabi- --disable-asm
上面我们说过,如果上一步执行了配置操作,这一步的命令中也可以不制定--sysroot,
--cc等一些参数,这里我在命令中还是加上了,方便大家查看。
4:编译
编译操作是最简单的了,唯一就是编译的时间会比较长一些,好吧,那就等他自己编译吧,执行“make”命令即可,执行之后,去冲咖啡吧。
编译完成之后就可以到libavcodec、libavfilter、libavformat、libavutil、libpostproc和libswscale文件夹下面去找对应的静态链接库文件,.a的文件,然后在所需要的项目中引入这些问价和ffmpeg的头文件即可。
当然了,如果你还是想使用android.mk文件的方式来编译,那么可以根据ffmpeg文件夹及其子文件夹中的mainfest文件来编写对应的android.mk文件并编译,这似乎在网络上已经有很多可以参考的方案了,这里就不在介绍了,大家可以参考这里(https://gist.github.com/1126971)的编译脚本,不过这种方式我暂时没有测试过,要大家自己去完成了,之后在给大家分享一下吧^_^。
另外,关于在android中编译ffmpeg也有很多已知的方案可以参考,如下:
1. Rockplayer:
http://rockplayer.freecoder.org/index_cn.html http://blog.csdn.net/harry_helei/article/details/6322767
2. havlenapetr:
http://github.com/havlenapetr/FFMpeg http://blog.csdn.net/scut1135/article/details/6536157 http://hi.baidu.com/eefolks/blog/item/e0329e4682859129cefca351.html http://ajavn.com/anzhuotuandui/4351.html
3. halfninja:
https://github.com/halfninja/android-ffmpeg-x264
4. olvaffe's:
http://gitorious.org/~olvaffe/ffmpeg/ffmpeg-android http://www.nujk.com/ffmpeg-on-android
5. 流媒体开发论坛 - 罗索工作室:
http://www.rosoo.net/a/201108/14834.html http://bbs.rosoo.net/thread-6252-1-1.html
如果大家编译遇到问题欢迎在后面补充,同时,也希望各位朋友可以一起交流学习ffmpeg,毕竟这是一个很长强大的多媒体库。有事儿就@杨丰盛
由于项目需求,前两天在在ios项目中使用ffmpeg,写下了“关于ios中编译ffmpeg0.9.2库”,然后有朋友在咨询,如何编译最新版的ffmpeg,其实最新版的编译也差不多,只是看看最新版的改变如何,修改一些参数即可,同时又因为我需要将项目跨平台到android,所以这次又需要在android中使用ndk来编译ffmpeg。索性在android上就编译一个最新版的ffmpeg出来看看。
还是先说一下我的环境:
mac os x 10.7.4
Eclispe3.7
android-sdk-macosx
android-ndk-r7b
1:打开ffmpeg官网(http://ffmpeg.org/download.html),看到最新版是ffmpeg-0.10.3,直接就选择了一个最新版本的zip包下载,然后解压,得到ffmpeg-0.10.3文件夹。
因为在网上也看到很多文章用android
ndk来编译ffmpeg,但是整个编译和配置过程都很麻烦,并且大部分朋友反应,编译过程总是会出现很多错误,各种编译不成功的原因,这次我们就来个简单点儿的,但是需要确保android
ndk的版本在r5以上。原因请看android
ndk目录中的doc/STANDALONE-TOOLCHAIN.html文档,因为Android
ndk中的交叉工具链可以将一套完整的工具链从NDK里复制出来,不在和ndk放在一起,以后用复制出来的工具链提供的库和头文件来编译会更加方便。
2:从ndk中赋值一个交叉工具链,使用ndk中的make-standalone-toolchain工具。在中断执行如下命令:
$NDK/build/tools/make-standalone-toolchain.sh --platform=android-9 --install-dir=/Users/yarin/android-toolchain
如果环境变量中有ndk的tools目录,就不需要前面的$NDK/build/tools/目录了。
这样就会在制定的目录“/User/yarin”目录中产生一个android-toolchain文件夹,就是我们从ndk中分离出来的独立交叉工具链,其中的sysroot目录就包含了一些基本库和头文件。一会儿我们就会用它来编译ffmpeg。
其中有个参数--platform,做过android的都知道吧,用于制定api版本。
3:配置编译器
打开终端,进入第一步解压得到的ffmpeg-0.10.3目录,在其中输入如下命令:
$ export PATH=/User/yarin/android-toolchain/bin:$PATH
$ export CC=arm-linux-androideabi-gcc
$ export CXX=arm-linux-androideabi-g++
$ export CXXFLAGS="-lstdc++"
这些命令主要用于设置环境变量,在后期的编译过程中,就不需要在设置sysroot路径和CC了,而且还能够使用STL,异常,RTTI。当然了,你也可以不在这里设置,而在后期的./configure中去制定需要的路径。
3:配置编译ffmpeg的选项参数
这一步比较简单,需要什么就模块就打开什么模块,我项目中的需求配置如下:
./configure --prefix=/Users/yarin/android-toolchains --disable-doc --disable-ffmpeg --disable-ffplay --disable-ffserver --disable-avfilter --disable-devices --disable-debug --disable-encoders --enable-cross-compile --enable-decoders --enable-demuxer=mov --enable-demuxer=h264 --enable-protocol=file --enable-avformat --enable-avcodec --enable-decoder=rawvideo --enable-decoder=h264 --enable-decoder=mjpeg --enable-decoder=h263 --enable-decoder=mpeg4 --enable-parser=h264 --enable-zlib --enable-shared --enable-static --enable-pic --nm=arm-linux-androideabi-nm --sysroot=/Users/yarin/android-toolchains/sysroot --cc=arm-linux-androideabi-gcc --arch=arm --target-os=linux --cross-prefix=arm-linux-androideabi- --disable-asm
上面我们说过,如果上一步执行了配置操作,这一步的命令中也可以不制定--sysroot,
--cc等一些参数,这里我在命令中还是加上了,方便大家查看。
4:编译
编译操作是最简单的了,唯一就是编译的时间会比较长一些,好吧,那就等他自己编译吧,执行“make”命令即可,执行之后,去冲咖啡吧。
编译完成之后就可以到libavcodec、libavfilter、libavformat、libavutil、libpostproc和libswscale文件夹下面去找对应的静态链接库文件,.a的文件,然后在所需要的项目中引入这些问价和ffmpeg的头文件即可。
当然了,如果你还是想使用android.mk文件的方式来编译,那么可以根据ffmpeg文件夹及其子文件夹中的mainfest文件来编写对应的android.mk文件并编译,这似乎在网络上已经有很多可以参考的方案了,这里就不在介绍了,大家可以参考这里(https://gist.github.com/1126971)的编译脚本,不过这种方式我暂时没有测试过,要大家自己去完成了,之后在给大家分享一下吧^_^。
另外,关于在android中编译ffmpeg也有很多已知的方案可以参考,如下:
1. Rockplayer:
http://rockplayer.freecoder.org/index_cn.html http://blog.csdn.net/harry_helei/article/details/6322767
2. havlenapetr:
http://github.com/havlenapetr/FFMpeg http://blog.csdn.net/scut1135/article/details/6536157 http://hi.baidu.com/eefolks/blog/item/e0329e4682859129cefca351.html http://ajavn.com/anzhuotuandui/4351.html
3. halfninja:
https://github.com/halfninja/android-ffmpeg-x264
4. olvaffe's:
http://gitorious.org/~olvaffe/ffmpeg/ffmpeg-android http://www.nujk.com/ffmpeg-on-android
5. 流媒体开发论坛 - 罗索工作室:
http://www.rosoo.net/a/201108/14834.html http://bbs.rosoo.net/thread-6252-1-1.html
如果大家编译遇到问题欢迎在后面补充,同时,也希望各位朋友可以一起交流学习ffmpeg,毕竟这是一个很长强大的多媒体库。有事儿就@杨丰盛
相关文章推荐
- 在32位的Ubuntu 11.04中为Android NDK r6编译FFmpeg0.8.1版-Android中使用FFmpeg媒体库(一)
- ffmpeg2.2在ubuntu下使用NDK编译——并在android工程下测试使用
- linux中使用NDK编译ffmpeg的android平台的可执行文件
- ffmpeg(最新版2.8.5 )在Fedora下使用NDK编译——并在android工程下测试使用
- android 移植ffmpeg后so库的使用
- 使用NDK交叉编译ffmpeg, android后台可执行。
- 使用NDK编译FFmpeg到Android下使用
- 使用ubuntu14和ndk 编译ffmpeg在android平台的so动态库
- Android NDK的使用
- 【Android Native Code开发系列】七 使用NDK进行交叉编译 & 编译ACE for android
- MAC系统下利用NDK编译可供Android使用的FFmpeg(3.2.4)库
- window环境下使用ndk编译出android studio/Eclipse能使用的ffmpeg动态库
- ffmpeg2.2在ubuntu下使用NDK编译——并在android工程下测试使用
- 如何在android中利用NDK编译引入ffmpeg--- Syntax error: word unexpected (expecting ")")
- 在ubuntu 10下使用Android-ndk-r6b成功编译ffmpeg0.8.1
- ffmpeg2.2在ubuntu下使用NDK编译——并在android工程下测试使用
- 【Android】NDK编译ffmpeg(基于使用Ubuntu15.10)
- AndroidStudio2.2.3版本使用CMake编译NDK工程(ffmpeg)
- 在32位的Ubuntu 11.04中为Android NDK r6编译FFmpeg0.8.1版-Android中使用FFmpeg媒体库(一)
- 【游戏开发备注之一】关于Cocos2dx_v1.x版本iphone与Android运行出现图片白块、添加GameCenter报错问题及编译Android闪退的解决办法&&CCLOG与CClog的区别