美文网首页Android FFMPEGFFmpeg
FFmpeg Android 入门-ffmpeg+x264编译单

FFmpeg Android 入门-ffmpeg+x264编译单

作者: 天水_10 | 来源:发表于2017-09-08 00:04 被阅读2601次

    刚开始看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

    相关文章

      网友评论

        本文标题:FFmpeg Android 入门-ffmpeg+x264编译单

        本文链接:https://www.haomeiwen.com/subject/ajnvjxtx.html