美文网首页FFmpegAndroid开发Android知识
FFmpeg 编译(2)--单一版

FFmpeg 编译(2)--单一版

作者: esonyf | 来源:发表于2016-08-25 15:25 被阅读720次

写在前面的废话

接上一篇,介绍了如何编译出多个so文件。本片介绍如何编译出单一的so文件。网上对于编译出单一库文件大致分为两种方式:
1、利用NDK 环境,编写mk文件生成
2、先编译出FFmpeg模块的库文件,然后链接模块的库文件
对于以上两种方式,笔者更倾向于第二种,所以,这里重点介绍第二种,感兴趣的话可自行测试第一种,这里给出链接:
http://blog.csdn.net/huahuahailang/article/details/27374219
废话到此,言归正传

1、先贴出sh文件
# build_andorid.sh

NDK=xxx/android-ndk-r10e
SYSROOT=$NDK/platforms/android-9/arch-arm/
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.8/prebuilt/darwin-x86_64

function build_one
{
    ./configure \
        --prefix=$PREFIX \
        --enable-neon \
        --enable-hwaccel=h264_vaapi \
        --enable-hwaccel=h264_vaapi \
        --enable-hwaccel=h264_dxva2 \
        --enable-hwaccel=mpeg4_vaapi \
        --enable-hwaccels \
        --enable-static \
        --enable-jni \
        --enable-mediacodec \
        --enable-asm \
        --disable-shared \
        --disable-doc \
        --disable-ffmpeg \
        --disable-ffplay \
        --disable-ffprobe \
        --disable-ffserver \
        --disable-avdevice \
        --disable-doc \
        --disable-symver \
        --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
        --target-os=linux \
        --arch=arm \
        --enable-cross-compile \
        --sysroot=$SYSROOT \
        --extra-cflags="-Os -fpic $ADDI_CFLAGS" \
        --extra-ldflags="$ADDI_LDFLAGS" \
        $ADDITIONAL_CONFIGURE_FLAG
    make clean
    make -j4
    make install

    $TOOLCHAIN/bin/arm-linux-androideabi-ar d libavcodec/libavcodec.a inverse.o
    $TOOLCHAIN/bin/arm-linux-androideabi-ld -rpath-link=$SYSROOT/usr/lib -L$SYSROOT/usr/lib  -soname libffmpeg.so -shared -nostdlib  -z noexecstack -Bsymbolic --whole-archive --no-undefined -o $PREFIX/libffmpeg.so libavcodec/libavcodec.a libavformat/libavformat.a libavutil/libavutil.a libavfilter/libavfilter.a libswscale/libswscale.a libavdevice/libavdevice.a libswresample/libswresample.a -lc -lm -lz -ldl -llog --dynamic-linker=/system/bin/linker $TOOLCHAIN/lib/gcc/arm-linux-androideabi/4.8/libgcc.a
}
CPU=armv7-a
OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=neon -marm -march=$CPU -mtune=cortex-a8"
PREFIX=./android/$CPU
ADDITIONAL_CONFIGURE_FLAG=--enable-neon
build_one

笔者通过这种方式编译出来之后,生成的libffmpeg.so文件大小是70多兆,相比于多个模块的多个so文件要大很多

2、鸣谢

本文参考链接:
http://blog.csdn.net/feixiang_john/article/details/7894188

只是改动了几处

  • 添加硬件解码
  • -z,noexecstack 修改为 -z noexecstack
  • 删除--warn-once

ps:在NDK 9之后,以上两个命令有所改变,第一个要把“,”替换为空格,第二个没有找到替换的东西,所有笔者就给删除了

到此,FFmpeng的编译工作结束。

相关文章

网友评论

  • 得瑟的小蚂蚁:大神,帮我看一下,出现这个问题什么原因造成的?
    In file included from libavfilter/aeval.c:26:0:
    ./libavutil/avassert.h:30:20: fatal error: stdlib.h: No such file or directory
    #include <stdlib.h>
    ^
    compi latlibavfilter/af_adelay.oion te
    nated.
    In file included from ./libavutil/avutil.h:296:0,
    from libavfilter/avfilter.h:41,
    from libavfilter/audio.h:25,
    from libavfilter/af_acopy.c:19:
    ./libavutil/common.h:33:19: fatal error: errno.h: No such file or directory
    #include <errno.h>
    ^
    compilation terminated.
    In file included from ./libavutil/rational.h:32:0,
    from ./libavutil/opt.h:30,
    from libavfilter/af_acrusher.c:21:
    c:\users\dell\appdata\local\android\sdk\ndk-bundle\toolchains\arm-linux-androide
    abi-4.9\prebuilt\windows-x86_64\lib\gcc\arm-linux-androideabi\4.9.x\include\stdi
    nt.h:9:26: fatal error: stdint.h: No such file or directory
    # include_next <stdint.h>
    ^
    compilation terminated.
    make: *** [libavfilter/aeval.o] Error 1
    make: *** Waiting for unfinished jobs....
    make: *** [libavfilter/af_acopy.o] Error 1
    make: *** [libavfilter/af_acrusher.o] Error 1
    In file included from ./libavutil/avstring.h:25:0,
    from libavfilter/af_adelay.c:21:
    c:\users\dell\appdata\local\android\sdk\ndk-bundle\toolchains\arm-linux-androide
    abi-4.9\prebuilt\windows-x86_64\lib\gcc\arm-linux-androideabi\4.9.x\include\stdi
    nt.h:9:26: fatal error: stdint.h: No such file or directory
    # include_next <stdint.h>
    ^
    compilation terminated.
    感激不尽!!!
  • BlueSea017:我看别人应用里用的单个so也才十几兆啊,怎么减小这个包体
  • 催眠术:/Users/liyuzhao/mysoft/android-ndk-r10e/toolchains/arm-linux-androideabi-4.8/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-ld: error: cannot open libavdevice/libavdevice.a: No such file or directory
    催眠术:@esonyf 非常感谢,把--disable-avdevice \ 改为--enable-avdevice 解决了我的问题~ :+1:
    esonyf:@lyuzhao 你把这个“libavdevice/libavdevice.a”删掉,或者--disable-avdevice \ 改为--enable-avdevice 试一下,因为每个人的电脑环境都不一样,像这种问题都是不可以预估的,希望能帮到你。
  • 催眠术:你好,出现这个问题是什么原因?

本文标题:FFmpeg 编译(2)--单一版

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