作者:jl
首先,Android上面使用的是bionic的C标准库,所以即使你是使用的自带toolchain下面的eabi的arm编译器,其编译出来的 so文件存在调用上面的问题,同样的程序在一般的linux平台下面就可以使用,但是同样的编译环境在Android下面就不能运行,觉得很是奇怪。
没办法,只有自己搞清楚Android.mk这种非标准的makefile的语法,然后再去修改ffmpeg的自带的 makefile,ffmpeg的makefile的结构并不是很难,目录下面有libavutil libavcodec libavformat这三个主要的库,其中avcodec是依赖util,尔format是依赖于util和codec的,所以最先最好先编译 util。
在libavutil建立一个Android.mk的文件,下面我们开始写Android.mk,在写之前,说一下ffmpeg自带的 makefile的框架,ffmpeg在config命令之后会有一个config.h和一个config.mak,这两个文件加起来估计有 600-700个宏,来表述你的代码的各个方面,其中关于编译器、链接库、头文件、版本等等相关的就可以不要,config.mak把开始的一些行去掉,后面的基本上都是某些CONFIG _XX_DECODER等等的,这些根据实际情况来取舍,注意这里有几个宏和是和Android编译环境是相冲突的,注意改动对应地方的源码,基本上这个 config里面的东西不需要大改,在Android.mk里面直接include就行了,因为util比较简单,所以makefile、
也比较简单,一般标准的都需要调用subdir.mak这个东东,这个其实就是真正的编译,但是我们在Android.mk下,这个东西可以不要,直接把对应的源文件引入,标准的makefile是指定.o,我们这里是直接指定.c文件,之于源码的几个地方有Size_t这种错误,就需要在<string.h>前面加上<stdlib.h>,这个可能是因为使用的C库不同的原因。这个都是很简单的,修改几个宏,很快就可以编译通过。
下面就是libavcodec,这个基本上和上面的差不多,但是要注意我们这里是arm平台,把arm平台的几个汇编加进去,不要硬件加速,去掉 x11相关的一个解码库,然后就是有些格式想mkv等需要zlib 和bzlib库的,我郁闷了半天,后来发现,在external下面已经有这两个库,直接加入头文件目录,和相应的链接库,这个也很好编译通过,注意并不是这个目录下面所有的.c文件都需要编译的,有些事不需要的,具体参见原来的makefile。
最后一个format相对简单了,基本和上面差不多。
编译完全通过之后,修改libmediaplayservice里面的代码,写一个简单的FfmpegPlayer,然后上层使用标准的MediaPlayer.java调用打开一个ape文件,播放完全正常,音质很棒,无损嘛。在模拟器上运行一点不卡。
下一步,把视频也添加进去,这个可能有点麻烦,因为还不是很清楚Android下面显示接口以及音视频同步的问题。
转:Android上ffmpeg移植(2)
最新推荐文章于 2024-09-18 15:29:47 发布