刚开始看ffmpeg 编译so的时候,发现不少教程都是编译出多个so来集成,强迫症表示有点儿接受不了。下面主要讲一下ffmpeg+x264如何编译单个so。
ffmpeg下载:https://ffmpeg.org/ 3.3.3版本
x264下载地址:http://www.videolan.org/developers/x264.html 下载最新的就好
打包环境为mac平台。其他平台需要做一些修改,例如NDK 、PLATFORM 、TOOLCHAIN,和以上路径拼接在一起的路径也要注意。
分别解压文件,并把x264文件夹重命名为libx264,复制到ffmpeg文件夹中。
x264打包脚本:x264_arm_build.sh 需要复制到libx264文件夹中
#!/bin/bash NDK=/Users/huangyanan/Library/android/sdk/ndk-bundle//替换为自己的 PLATFORM=$NDK/platforms/android-16/arch-arm TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64 PREFIX=./android/arm function build_one { ./configure \ --prefix=$PREFIX \ --disable-shared \ --enable-static \ --enable-pic \ --enable-strip \ --enable-thread \ --enable-asm \ --host=arm-linux-androideabi \ --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \ --sysroot=$PLATFORM \ --extra-cflags="-Os -fpic" \ --extra-ldflags="" \ $ADDITIONAL_CONFIGURE_FLAG make clean make -j4 make install } build_one
--enable-asm打开后,性能会提升不少。
再编译过程如果碰到如下问题
libx264.a(ratecontrol-8.o):ratecontrol.c:function x264_8_ratecontrol_new: error: undefined reference to 'log2'
libx264.a(ratecontrol-8.o):ratecontrol.c:function x264_8_ratecontrol_new: error: undefined reference to 'log2'
libx264.a(ratecontrol-8.o):ratecontrol.c:function x264_8_ratecontrol_new: error: undefined reference to 'log2'
libx264.a(ratecontrol-10.o):ratecontrol.c:function x264_10_ratecontrol_new: error: undefined reference to 'log2'
collect2: error: ld returned 1 exit status
需要把config.h中的
define HAVE_LOG2F 1
修改为
define HAVE_LOG2F 0
然后手动执行make。
ffmpeg 打包脚本:ffmpeg_arm_v7a_build.sh 复制到ffmpeg文件夹中
#!/bin/bash NDK=/Users/huangyanan/Library/android/sdk/ndk-bundle//替换自己的路径 PLATFORM=$NDK/platforms/android-16/arch-arm TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64 basepath=$(cd `dirname $0`; pwd) X264_INCLUDE=$basepath/libx264/android/arm/include X264_LIB=$basepath/libx264/android/arm/lib function build_one { ./configure \ --prefix=$PREFIX \ --arch=arm \ --cpu=armv7-a \ --target-os=android \ --enable-cross-compile \ --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \ --sysroot=$PLATFORM \ --extra-cflags="-I$X264_INCLUDE -I$PLATFORM/usr/include" \ --extra-ldflags="-L$X264_LIB" \ --cc=$TOOLCHAIN/bin/arm-linux-androideabi-gcc \ --nm=$TOOLCHAIN/bin/arm-linux-androideabi-nm \ --disable-shared \ --enable-static \ --enable-gpl \ --enable-version3 \ --enable-pthreads \ --enable-runtime-cpudetect \ --disable-small \ --disable-network \ --disable-vda \ --disable-iconv \ --enable-asm \ --enable-neon \ --enable-yasm \ --disable-encoders \ --enable-libx264 \ --enable-encoder=libx264 \ --enable-encoder=aac \ --enable-encoder=mpeg4 \ --enable-encoder=mjpeg \ --enable-encoder=png \ --disable-muxers \ --enable-muxer=mov \ --enable-muxer=mp4 \ --enable-muxer=adts \ --enable-muxer=h264 \ --enable-muxer=mjpeg \ --disable-decoders \ --enable-decoder=aac \ --enable-decoder=aac_latm \ --enable-decoder=mp3 \ --enable-decoder=h264 \ --enable-decoder=mpeg4 \ --enable-decoder=mjpeg \ --enable-decoder=png \ --disable-demuxers \ --enable-demuxer=image2 \ --enable-demuxer=h264 \ --enable-demuxer=aac \ --enable-demuxer=mp3 \ --enable-demuxer=mpc \ --enable-demuxer=mpegts \ --enable-demuxer=mov \ --disable-parsers \ --enable-parser=aac \ --enable-parser=ac3 \ --enable-parser=h264 \ --disable-protocols \ --enable-protocol=file \ --enable-protocol=concat \ --enable-filters \ --enable-zlib \ --disable-outdevs \ --disable-doc \ --disable-ffplay \ --disable-ffmpeg \ --disable-ffserver \ --disable-debug \ --disable-ffprobe \ --disable-postproc \ --disable-avdevice \ --disable-symver \ --disable-stripping \ --extra-cflags="-Os -fpic $ADDI_CFLAGS" \ --extra-ldflags="$ADDI_LDFLAGS" \ $ADDITIONAL_CONFIGURE_FLAG make clean make -j8 make install $TOOLCHAIN/bin/arm-linux-androideabi-ld \ -rpath-link=$PLATFORM/usr/lib \ -L$PLATFORM/usr/lib \ -L$PREFIX/lib \ -L$X264_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 \ libx264/libx264.a \ -lc -lm -lz -ldl -llog --dynamic-linker=/system/bin/linker \ $TOOLCHAIN/lib/gcc/arm-linux-androideabi/4.9.x/libgcc.a } # arm v7vfp CPU=arm-v7a OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfp -marm -march=armv7-a " ADDI_CFLAGS="-marm" PREFIX=./android/$CPU build_one
--disable-small 看help里解释是牺牲速度换体积,看具体需要。脚本中的配置可以参考,实际使用时需要调整
切到libx264目录
chmod a+x x264_arm_build.sh
./x264_arm_build.sh
成功之后,切到ffmpeg目录
chmod a+x ffmpeg_arm_v7a_build.sh
./ffmpeg_arm_v7a_build.sh
脚本运行结束之后,查看ffmpeg/android/arm_v7a目录,应该能发现libffmpeg.so,到此就能打出arm_v7a 平台的so了,打出来的so体积约(7M),最终集成到项目中release apk后占整个apk体积约3M左右。
代码已上传到github,可以把两个脚本下载下来,按照自己需要配置编译。
如果操作中有碰到问题,麻烦留言。
参考
http://blog.csdn.net/huangkaiyue1/article/details/42081299
网友评论