/********************************************************************************************
* author:conowen@大钟
* E-mail:[email protected]
* http://blog.csdn.net/conowen
* 注:本文为原创,仅作为学习交流使用,转载请标明作者及出处。
********************************************************************************************/
首先说明一点,此FFmpeg时官方原版,没有实现JNI层与java层,个人推荐使用移植havlenapetr的FFMpeg工程,已经实现了实现JNI层与java层,工作量少很多。
havlenapetr的FFMpeg工程编译可以参考我的博文:http://blog.csdn.net/conowen/article/details/7526398
一、编译环境说明
系统:windows 7 (64bit)+cygwin
NDK版本:android-ndk-r7b(windows)
FFmpeg版本:FFmpeg 0.10.2 "Freedom"
二、安装工具
2.1、安装cygwin的时候,默认为在线安装
当出现Select Packages对话框时,搜索“devel”,为了以防万一,把安装选项“default”更改为“install”,安装所以必须的编译工具。然后进入漫长的下载状态,差不多一两个小时,接下来的步骤默认就行。
2.2、安装Android NDK
安装完cygwin后,去到其安装目录,可以发现有一个“home”目录,里面有一个“当前windows用户名”的文件夹,就相当于linux系统下面的/home/userName了。然后把Android NDK(windows版本)安装到home目录下的那个“当前windows用户名”文件夹中。
2.3、配置NDK环境变量
在home目录下的那个“当前windows用户名下,用文本编辑器打开“.bash_profile”文件,在后面加入如下配置信息
ndk=/home/Administrator/android-ndk-r7b export ndk
2.4、完毕
打开cygwin,执行
cd $ndk
三、编译FFmpeg
3.1、在http://ffmpeg.org/download.html网站可以下载最近的FFmpeg源码包,也可以通过git clone方式下载。
然后在windows系统中,随便在一个地方新建一个目录,如“myplayer”,在其下新建一个名为“jni”的目录,然后把下载回来的FFmpeg源码包解压在这里,文件名可以命名为“ffmpeg”。
3.2、下载下来的FFmpeg是一份纯C&C++的代码,为了编译它,需要configure,来配置所需要的模块和开启哪些功能,然后才能make。
在ffmpeg里面新建一个config.sh批处理文件,来实现configure。
config.sh内容如下:
./configure \ --disable-static \ --enable-asm \ --cpu=cortex-a8 \ --arch=armv7 \ --enable-neon \ --enable-shared \ --enable-memalign-hack \ --disable-network \ --disable-muxers \ --disable-protocols \ --disable-demuxers \ --disable-encoders \ --disable-parsers \ --disable-bsfs \ --enable-gpl \ --enable-version3 \ --enable-nonfree \ --disable-doc \ --disable-ffmpeg \ --disable-ffplay \ --disable-ffprobe \ --disable-ffserver \ --disable-avdevice \ --disable-avfilter \ --disable-postproc \ --disable-filters \ --disable-devices \ --enable-small \ --cross-prefix=$ndk/toolchains/arm-linux-androideabi-4.4.3/prebuilt/windows/bin/arm-linux-androideabi- \ --enable-cross-compile \ --target-os=linux \ --extra-cflags='-I$ndk/platforms/android-9/arch-arm/usr/include -mfpu=neon -mfloat-abi=softfp' \ --extra-ldflags='-L$ndk/platforms/android-9/arch-arm/usr/lib -nostdlib' \ --arch=arm \ --disable-debug \ --disable-stripping \ --disable-armv5te \ --disable-armv6 \ --disable-armv6t2 \ sed -i 's/HAVE_LRINT 0/HAVE_LRINT 1/g' config.h sed -i 's/HAVE_LRINTF 0/HAVE_LRINTF 1/g' config.h sed -i 's/HAVE_ROUND 0/HAVE_ROUND 1/g' config.h sed -i 's/HAVE_ROUNDF 0/HAVE_ROUNDF 1/g' config.h sed -i 's/HAVE_TRUNC 0/HAVE_TRUNC 1/g' config.h sed -i 's/HAVE_TRUNCF 0/HAVE_TRUNCF 1/g' config.h sed -i 's/HAVE_SYMVER 1/HAVE_SYMVER 0/g' config.h
./config.sh成功之后会生成config.h,config.log,config.mak等文件,可以通过查看config.h,是否开启成功了。
如我的上面的config.sh里面时开启了neon汇编优化选项,所以在config.h可以发现以下语句后面的值为1,表示开启。
#define HAVE_NEON 1
注意:
后面的
sed -i 's/HAVE_SYMVER 1/HAVE_SYMVER 0/g' config.h表示在config.h里面,把HAVE_SYMVER 0修改为1。
3.3、编写Android.mk文件
(
(uint8 const *)avframe.data[0], avframe.linesize[0],
(uint8 const *)avframe.data[1], avframe.linesize[1],
(uint8 const *)avframe.data[2], avframe.linesize[2],
dec->width, dec->height,
scaledframe.data[0], scaledframe.linesize[0],
scaledframe.data[1], scaledframe.linesize[1],
scaledframe.data[2], scaledframe.linesize[2],
txtwidth, txtheight,
);
(
(const uint8_t *)scaledframe.data[0], scaledframe.linesize[0],
(const uint8_t *)scaledframe.data[1], scaledframe.linesize[1],
(const uint8_t *)scaledframe.data[2], scaledframe.linesize[2],
pktlist->pkt.data, txtwidth << 1,
txtwidth, txtheight);