最近需要做些基于android的音视频方面的开发,比较幸运的是,网上有一位国外的开发者分享了ffmpeg移植到android froyo的例子:

https://github.com/havlenapetr/FFMpeg

https://github.com/havlenapetr/android_frameworks_base/tree/froyo

我想,可以基于他的例子先搭建好相关的开发调试环境,在自己的手机上把该例子运行起来,通过跟踪调试的方式大概了解ffmpeg的api及其相关的编解码流程。

于是,我开始着手搭建相应的android开发调试环境。

1)初步验证例子的“可编译性”

编译网上的代码,经常会遇到各种问题,但havlenapetr的这个例子挺不错的,整个例子可以直接导入eclipse中,没有任何错误。

Android FFmpeg框架 ffmpeg安卓开发_ffmpeg

即便是ndk部分,也可以顺利编译。

Android FFmpeg框架 ffmpeg安卓开发_android_02

2)android系统的编译环境

该例子用到两个库文件:libjniaudio.so和libjnivideo.so,它们是ffmpeg和目标设备的android系统的适配层,是作者基于froyo版本编译出来的。要移植该例子,需要重新编译这两个动态库。所以,需要建立android系统的编译环境。


每个人做事情都只能基于自己所拥有的资源,我手上有两个android手机可以用来做调试,其中一个是android 4.0.3版本,另一个是android 2.3.4版本。我首先考虑编译一份android 4.0.3的代码。但无奈,好容易从网上找到并下载的的4.0.3版本的代码,编译出错。而且,后来我还看到一个帖子,该帖子也说到4.0.3版本的编译,也遇到和我一样的编译错误,作者说换了一份代码就好了。这让我认为,再去寻找这个编译错误的解决方法变得没有意义,很可能是源码本身就有问题。幸运的是,从网上找到了一份2.3.5的代码,它在我的机器上是可以编译通过的,我的手机是2.3.4版本,和2.3.5版本相差不大:

API等级10:Android 2.3.3-2.3.7 Gingerbread

换句话说,用2.3.5的编译系统编译出来的动态库在2.3.4的手机上应该是可行的。

3)动态库的编译

在前面提到的第二个链接中,havlenapetr提供了这两个动态库libjniaudio.so&libjnivideo.so对应的源代码,甚至连Android.mk文件都有,挺佩服老外的这种认真,严谨的态度和精神。

framework/base/native/

audio/jni/Android.mk

audiotrack.cpp

                                          graphics/

audiotrack.h

                                                                       bitmap.h

surface.h

video/jni/Android.mk

surface.cpp


把audio&video目录,以及audiotrack.h&surface.h头文件拷贝到编译环境的相同目录下,编译,可生成针对当前android系统版本的库文件。

Android FFmpeg框架 ffmpeg安卓开发_audio_03

把新生成的库文件拷贝到eclipse工程的jni/prebuilt目录下,替换原先的同名文件,至此,针对新的目标设备2.3.4版本的ffpmeg移植开发环境就算是搭建好了,往下,就可以在手机上调试这个例子了。