最近为Android2.3的多媒体框架Stagefright做Extractor,考虑到ffpeg能提供相对完整的文件格式解析,因此选择了它。所谓AOSP,是Android Open Source Project的缩写,也就是说我不是用NDK进行编译的,而是在Platform中编译的。
做过多媒体中间件的朋友都知道,视频文件在解码前必须先进行解析,主要工作是完成音视频的分流,并保存解析出来的音视频流的格式信息,如:编码格式,比特率,mime类型等等。这里提到的Extractor就是完成这个工作的,在其它多媒体框架中也有叫demuxer,parser或splitter。
再提一下rockplayer_ffmpeg,是在开源ffmpeg基础上进行裁减后的版本,用于目前广泛流行的一个全格式多媒体播放器rockplayer上,因此起名rockplayer_ffmpeg,下载地址:http://rockplayer.freecoder.org/download/rockplayer_ffmpeg.zip
最后说明对这个工程的修改和编译,本人将rockplayer_ffmpeg编译成.so文件。将rockplayer_ffmpeg与开源的ffmpeg进行比较,除了对目录和文件本身的差别外,最明显的差别是:rockplayer_ffmpeg的作者好人啊,将所有源文件整理成适合编译为一个单纯的.so文件中。这与目前网上广为流传的开源的ffmpeg在NDK下的编译有很大不同,尽管后者也是将其编译为一个.so,但是其中在.so中又依赖libavformat,libavutil,libavcodec等静态库。用NDK这种方式在AOSP下编译后,在使用过程中可能会遇到意想不到的错误,至少我碰到过,霎时恼人啊,列为看官希望你们好运。
这里的主要工作是修改rockplayer_ffmpeg目录下的Android.mk文件,config.h文件。
首先,Android.mk的修改,记录如下 :
1、添加几个变量:
LOCAL_ARM_MODE := arm
LOCAL_PRELINK_MODULE := false //如果你愿意去修改prelink-linux-arm.map文件,可以不加该变量
LOCAL_MODULE_TAGS := optional
2、去掉以下这几行,我这么做是由于兄弟我用的ARM芯片不支持这些个特性,如果兄弟你的支持,可以考虑加上
LOCAL_SRC_FILES +=$(VFP_SRC_FILES)
LOCAL_SRC_FILES +=$(ARM6_SRC_FILES)
LOCAL_SRC_FILES +=$(NEON_SRC_FILES)
3、注释掉以下几个源文件:
libavcodec/dxa.c
libavcodec/flashsv.c
libavcodec/lcldec.c
libavcodec/pngdec.c
libavcodec/tscc.c
libavcodec/zmbv.c
原因是:这些文件都需要一个叫<zlib.h>的头文件,而在AOSP的标准径下没有,所以报错。看了下这这几个文件,都是codec用的,我作文件解析暂时用不到,所以直接kill掉了。如果兄弟你要用这些codec文件的话,恭喜你自己解决,要是能够把解决方法一并贴出来让大家学习就更完美了,兄弟这里先谢了。
4、可选项,针对那些需要用LOGI/D/V/W等进行信息打印的看官,那么在LOCAL_SHARED_LIBRARIES变量后添加一个libcutils
config.h的修改 :
1、将CONFIG_ZLIB改为0,为了关闭对<zlib.h>头文件的引用
2、如果报什么XXX_DECODER/ENCODER啥的找不到或类似错误,直接把CONFIG_XXX_DECODER/ENCODER置为0