Android多媒体开发(3)————使用Android(安卓)NKD编译havlenapetr-FFMpeg-7c27aa2
/********************************************************************************************
* author:conowen@大钟
* E-mail:conowen@hotmail.com
* http://blog.csdn.net/conowen
* 注:本文为原创,仅作为学习交流使用,转载请标明作者及出处。
********************************************************************************************/
1、
使用NDK去编译官方的FFmpeg原版的话,还得自己实现JNI层与java层,工程量比较大。所以移植FFmpeg到Android平台时,可以移植一些已经实现JNI与JAVA层的开源项目,毕竟软件行业从来都是站在巨人肩膀上发展的。
2、 /FFMpeg
havlenapetr的开源项目是比较出名的一个FFmpeg工程,很多Android多媒体项目都是在此基础上面修改的。
下载地址:https://github.com/havlenapetr/FFMpeg
可以直接ZIP包:https://github.com/havlenapetr/FFMpeg/zipball/debug
或者通过git方式下载,新建一个目录,然后在linux的终端下执行,当然了,你要事情安装git的相关工具
3、利用NDK编译生成so库
下载后直接在havlenapetr-FFMpeg-7c27aa2的顶级目录下执行
是可以编译通过的,不会提示任何error。
关于如何利用NDK编译,可以参考我之前的博文:http://blog.csdn.net/conowen/article/details/7518870
4、导入java工程,实现播放
然后把在eclipse里面,把havlenapetr-FFMpeg-7c27aa2这个项目import进来,就可以播放视频了。
4.1、需要注意的是:这个版本的havlenapetr FFmpeg工程只能在Android 2.2上面运行,因为havlenapetr采用的是音视频直接在JNI层输入。可以注意到havlenapetr-FFMpeg-7c27aa2目录下有prebuilt这样一个目录,此目录下有Android 2.2版本的libjniaudio.so和libjnivideo.so两个库文件。
4.2、Android版本不同导致不能播放:
havlenapetr的FFmpeg项目音视频输出如下
音频:采用Android底层的audiotrack输出。
视频:在FFmpeg解码之后,得到YUV信号,然后转换成RGB信号,最终通过Android底层的surface输出。
提示:可以移植SDL开源库实现音视频输出,因为SDL的视频输出机制是通过OPenGL呈现画面,这样就可以兼容所有的Android平台。
但是问题就来了,Android每个版本的framework都是不大一样的,所以要在底层使用Android的audiotrack和surface来输入音视频信号,就要在相应版本的Android源代码中,重新编译生成libjniaudio.so和libjnivideo.so两个库文件了。
5、编译havlenapetr FFmpeg工程Android 2.3版本的libjniaudio.so和libjnivideo.so
首先要明白一点,Android的官方源代码编译之后,是不会生成libjniaudio.so和libjnivideo.so的。所以要自己添加audiotrack.cpp、surface.cpp和Android.mk文件到Android源代码里面编译生成。(每次编译libjniaudio.so和libjnivideo.so都要重新编译这个Android源代码,时间比较长。)
5.1下载audio与video文件夹
可以在https://github.com/havlenapetr/android_frameworks_base下载audiotrack.cpp、surface.cpp和Android.mk,注意要选择正确的branch(分支)
froyo---->Android 2.2
gingerbread---->Android 2.3
ICS---->Android 4.0
5.2、编译Android系统源代码
下载之后,然后找到里面的native文件夹,把里面的audio和video文件夹拖进Android源代码的frameworks/base/native目录下。
需要注意的一点是:
gingerbread下载之后,里面是没有audio和video文件夹的,但是可以用froyo版本的audio和video文件夹。(也就是下载gingerbread感觉也没啥用Orz~~~)
但是我们可以使用froyo的audio和video文件夹,编译Android源代码是可以成功通过的,ndk-build也可以通过,但是在Android的java工程里面使用就会有以下错误信息。
加载库时,找不到mSruface类
修改方法是:
将surface.cpp中mSurface改为 mNativeSurface ,然后重新编译即可。当然了,你也可以用ICS的surface.cpp文件,这个版本是没有问题的。
另外编译havlenapetr FFmpeg工程Android 4.0版本的libjniaudio.so和libjnivideo.so与上面步骤差不多。
/************************************************************************/
附上我所使用的audio与video(来源havlenapetr的项目)
video/jni/surface.cpp(注意目录结构)
video/jni/Android.mk(注意目录结构)
/audio/jni/audiotrack.cpp(注意目录结构)
/audio/jni/Android.mk(注意目录结构)
更多相关文章
- AndroidStudio3.6.3新版本遇到的坑
- Android开发错误——Android(安卓)Studio中遇到过的错误问题与解
- 在编译Android时,开机不锁屏
- Android(安卓)Firewall(防火墙) AndFire 首发版本发布
- Android(安卓)ADT & SDK离线下载地址
- Android(安卓)Studio 1.2中配置androidannotations
- Android(安卓)app版本号的修改
- Android(安卓)获取包名,版本信息
- Android(安卓)开源源代码收集(不断更新中...)