之所以要在linux下编译ffmpeg,是因为在windows下的坑很多,而且在linux下编译方便快捷。
现在大部分的电脑都是windows,所以我们可以先装个虚拟机,装个linux系统,这里不详细说了,网上教程很多,这里我用的虚拟机是Oracle VM VirtualBox,系统则用的是Ubuntu,只要网速快,都不是问题。。。
ffmpeg源码:https://ffmpeg.org/
ndk下载:http://www.androiddevtools.cn/
以上源码解压到你新建的目录下就可以了
FFMPEG默认编译出来的库后缀是有加版本号的,这种Android上似乎是加载不了哇!别着急,稍微改改就成。将configure文件中的下面四行:
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)'
在你解压后的ffmpeg源码的根目录下新建一个build.sh文件(记住这是个脚本文件),脚本代码如下,你只需复制进你新建的build.sh文件了,旨在将ffmpeg编译成单个类库(参照http://blog.csdn.net/leixiaohua1020/article/details/47011021):
make clean
export NDK=/home/loften/ffmpeg/android-ndk-r13b
export PREBUILT=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt
export PLATFORM=$NDK/platforms/android-14/arch-arm
export PREFIX=../ff-pure-onelib
build_one(){
./configure --target-os=linux --prefix=$PREFIX \
--enable-cross-compile \
--enable-runtime-cpudetect \
--disable-asm \
--arch=arm \
--cc=$PREBUILT/linux-x86_64/bin/arm-linux-androideabi-gcc \
--cross-prefix=$PREBUILT/linux-x86_64/bin/arm-linux-androideabi- \
--disable-stripping \
--nm=$PREBUILT/linux-x86_64/bin/arm-linux-androideabi-nm \
--sysroot=$PLATFORM \
--enable-gpl --enable-static --disable-shared --enable-nonfree --enable-version3 --enable-small \
--enable-zlib --disable-ffprobe --disable-ffplay --disable-ffmpeg --disable-ffserver --disable-debug \
--extra-cflags="-fPIC -DANDROID -D__thumb__ -mthumb -Wfatal-errors -Wno-deprecated -mfloat-abi=softfp -marm -march=armv7-a"
}
build_one
make
make install
$PREBUILT/linux-x86_64/bin/arm-linux-androideabi-ld -rpath-link=$PLATFORM/usr/lib -L$PLATFORM/usr/lib -L$PREFIX/lib -soname libffmpeg.so -shared -nostdlib -Bsymbolic --whole-archive --no-undefined -o $PREFIX/libffmpeg.so libavcodec/libavcodec.a libavfilter/libavfilter.a libswresample/libswresample.a libavformat/libavformat.a libavutil/libavutil.a libswscale/libswscale.a libpostproc/libpostproc.a libavdevice/libavdevice.a -lc -lm -lz -ldl -llog --dynamic-linker=/system/bin/linker $PREBUILT/linux-x86_64/lib/gcc/arm-linux-androideabi/4.9.x/libgcc.a
cd ..
说明:
export NDK=/home/loften/ffmpeg/android-ndk-r13b
export PREBUILT=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt
export PLATFORM=$NDK/platforms/android-14/arch-arm
这里指定的ndk platform的路径(确保目录里存在),一定要选择比你的目标机器使用的版本低的,比如你的手机是android-23版本,那么就选择低于23的
(可修改成你想要的目录)
export PREFIX=../ff-pure-onelib
— 以上几点都是根据您解压的ndk来配置的,细节方面的修改应实际根据您下载的ndk来查看配置就行了。
最后把拿到的库文件测试下效果,写一个jni的程序调用下。 在android studio中就可以通过cmake来开心的玩耍了。。。。
x264下载:http://www.videolan.org/developers/x264.html
ffmpeg下载:http://www.ffmpeg.org/download.html
在你解压后的x264源码的根目录下新建一个build.sh文件,具体内容如下:
NDK=/home/loften/Android/android-ndk-r13b
PREBUILT=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
function build_one(){
./configure --prefix=$PREFIX \
--enable-static \
--enable-shared \
--enable-pic \
--disable-asm \
--disable-cli \
--host=arm-linux \
--sysroot=$PLATFORM \
--cross-prefix=$PREBUILT/bin/arm-linux-androideabi-
make clean
make -j4
make install
}
CPU=arm
PREFIX=$(pwd)/android/$CPU
ADDI_CFLAGS="-marm"
build_one