准备过程:
1. 下载ffmpeg源码,最新的: git://source.ffmpeg.org/ffmpeg.git
2. 下载x264: git clone git://git.videolan.org/x264.git
3. 安装ndk,见Android ndk开发
编译过程:
1) x264编译
编译脚本:
#!/bin/bash
NDK=/opt/android-19-toolchain
PLATFORM=${NDK}/sysroot
../x264/configure --enable-static --enable-pic --disable-asm --disable-cli --host=arm-linux --cross-prefix=${NDK}/bin/arm-linux-androideabi- --sysroot=${NDK}/sysroot --prefix=./target
make
make install
注意脚本中的路径
2) ffmpeg编译
修改ffmpeg-2.2/configure文件
如果直接按照未修改的配置进行编译,结果编译出来的so文件类似libavcodec.so.55.39.101,版本号位于so之后,Android上似乎无法加载。因此需要按如下修改:
将该文件中的如下四行:
SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'
LIB_INSTALL_EXTRA_CMD='$$(RANLIB)"$(LIBDIR)/$(LIBNAME)"'
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'
SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR)$(SLIBNAME)'
替换为:
SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
LIB_INSTALL_EXTRA_CMD='$$(RANLIB)"$(LIBDIR)/$(LIBNAME)"'
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
SLIB_INSTALL_LINKS='$(SLIBNAME)'
2、 创建一个空txt文件,改名字为ffmpeg-build.sh,将以下脚本复制进去,另外,NDK,SYSROOT ,TOOLCHAIN依据自己的系统配置进行修改
#!/bin/bash
SOURCE_DIR=$1
NDK=/home/patrick/adt/android-ndk-r10
SYSROOT=$NDK/platforms/android-19/arch-arm/
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86
function build_one
{
${SOURCE_DIR}/configure \
--prefix=./build/install \
--enable-shared \
--disable-static \
--enable-runtime-cpudetect \
--enable-memalign-hack \
--disable-doc \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-ffserver \
--disable-avdevice \
--disable-doc \
--disable-symver \
--enable-libx264 \
--enable-decoder=h264 \
--enable-encoder=libx264 \
--enable-gpl \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--target-os=linux \
--arch=arm \
--enable-cross-compile \
--sysroot=$SYSROOT \
--extra-cflags="-I$SOURCE_DIR/libx264/armv7/include -fPIC -DANDROID -D__thumb__ -mthumb -mthumb -Wfatal-errors -Wno-deprecated -mfloat-abi=softfp -mfpu=vfpv3-d16 -marm -march=armv7-a" \
--extra-ldflags="-L$SOURCE_DIR/libx264/armv7/lib"
}
build_one
3、建立空文件夹,将上面脚本放进去,执行 ffmpeg-build ffmpeg_source_dir,等待完成。
4、执行 make &make install
遇到问题 :
1、 resolve to a path with no project.properties file for project
解决:project.properties文件中android.library.reference.1 后面的路径有问题 ,或者路径指向的文件不存在,加上去就ok了。
2、 invalid resource directory name: /home/patrick/git/WebviewSnap/WebviewSnap/bin/res/crunch
解决:把crunch 文件夹直接删掉就可以了,因为他会自动生成。
3、Android NDK: WARNING: APP_PLATFORM android-19 is larger than android:minSdkVersion 8 in ./AndroidManifest.xml
解决:只需要在你的工程的:jni下增加
Application.mk
文件中添加如下代码即可:
APP_PLATFORM := android-8
4、System.loadLibrary() 加载失败
解决:1) 名称要去掉lib 和后缀.so ,如 libavcodec-57.so,就应该写成System.loadLibrary(“avcodec-57”);
2)多个库的加载顺序不能随意。无依赖的先加载,有依赖库的要放在所有依赖库之后。
5、Caused by: java.lang.UnsatisfiedLinkError: Cannot load library: reloc_library[1287]: 143 cannot locate ‘log2f’…
解决:将x264 和ffmpeg 源码下的 config.h 里的关于LOG2F 的宏改为 0,重新编译即可。
6、Invalid indirect reference 0x4eaec010 in decodeIndirectRef
解决:函数引用问题
7、Fatal signal 11 (SIGSEGV) at 0x51d0001d (code=1), thread 30456 (ple.webviewsnap)
解决:同8
8、 JNI ERROR (app bug): accessed stale local reference 0x21800021 (index 8 in a table of size 7)
解决: 把 targetSdkVersion 设置为更小的即可。