FFmpeg Android 入门-ffmpeg+x264编译单个so

96
天水_10
0.7 2017.09.08 00:04* 字数 1140

刚开始看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,可以把两个脚本下载下来,按照自己需要配置编译。

FFmpegUtils

如果操作中有碰到问题,麻烦留言。

参考
http://blog.csdn.net/huangkaiyue1/article/details/42081299

Android开发
Web note ad 1