【问题标题】:Reduce compiled ffmpeg library size based on what I need根据我的需要减少编译的 ffmpeg 库大小
【发布时间】:2014-11-13 06:04:17
【问题描述】:

我终于设法构建了 ffmpeg,详见此处:https://enoent.fr/blog/2014/06/20/compile-ffmpeg-for-android/,最后,我有了一个接受命令参数的 ffmpeg 库。

我只是在视频上应用水印图像,所以我使用这个 ffmpeg 命令:

ffmpeg -i input.avi -i logo.png -filter_complex 'overlay=10:main_h-overlay_h-10' output.avi

基本配置:

  ./configure \
    --prefix=$PREFIX \
    --disable-shared \
    --enable-static \
    --disable-doc \
    --disable-ffmpeg \
    --disable-ffplay \
    --disable-ffprobe \
    --disable-ffserver \
    --disable-doc \
    --disable-symver \
    --enable-protocol=concat \
    --enable-protocol=file \
    --enable-muxer=mp4 \
    --enable-demuxer=mpegts \
    --enable-memalign-hack \
    --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
    --target-os=linux \
    --arch=arm \
    --enable-cross-compile \
    --sysroot=$SYSROOT \
    --extra-cflags="-Os -fpic -marm $ADDI_CFLAGS" \
    --extra-ldflags="$ADDI_LDFLAGS"

ffmpeg 不需要其他命令。

编译 ffmpeg 时,我得到这些文件:

我想将库的大小尽可能减小,所以根据上述命令,我可以从最终构建中删除任何文件吗?

目前设备中最常见的 CPU 是哪一个? arm v7vfpv3arm v7vfparm v7n?我想覆盖尽可能多的设备。

#arm v6
#CPU=armv6
#OPTIMIZE_CFLAGS="-marm -march=$CPU"
#PREFIX=./android/$CPU 
#ADDITIONAL_CONFIGURE_FLAG=
#build_one

#arm v7vfpv3
CPU=armv7-a
OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfpv3-d16 -marm -march=$CPU "
PREFIX=./android/$CPU
ADDITIONAL_CONFIGURE_FLAG=
build_one

#arm v7vfp
#CPU=armv7-a
#OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU "
#PREFIX=./android/$CPU-vfp
#ADDITIONAL_CONFIGURE_FLAG=
#build_one

#arm v7n
#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

#arm v6+vfp
#CPU=armv6
#OPTIMIZE_CFLAGS="-DCMP_HAVE_VFP -mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU"
#PREFIX=./android/${CPU}_vfp 
#ADDITIONAL_CONFIGURE_FLAG=
#build_one

【问题讨论】:

  • 这些可能是调试版本。确保使用条带编译并优化参数。
  • 您可以从--disable-everything 开始,然后从那里开始构建。不过这可能很棘手。不要忘记用于 MP3 编码的 libmp3lame,因为您正在输出 AVI(为什么是 AVI 而不是 MP4?)。您还需要 zlib 进行 PNG 解码,并且不要忘记为覆盖使用启用过滤。

标签: android ffmpeg java-native-interface


【解决方案1】:

如果您的编译器支持,您可以使用链接时优化 (LTO)。我在 GCC 和 LTO 优化了从未调用过的东西方面取得了非常好的结果。我将从 LordNeckbeard 的建议开始,只配置您需要的部分,然后将 LTO 与您的静态链接一起使用。

减少代码大小的其他选项包括大多数编译器以一种或另一种形式支持的大小优化 (-Os)。您还可以使用 strip --strip-all ./your_binary 之类的方式去除不需要的符号。

如果所有这些都不足以让您达到目标大小,请查看像 UPX 这样的可执行打包程序。这些程序将在 CPU/内存之间进行权衡,以动态解压缩二进制文件。在某些架构上,这可以显着节省空间。

【讨论】:

    猜你喜欢
    • 2011-02-24
    • 1970-01-01
    • 2012-11-24
    • 2014-01-08
    • 2018-11-03
    • 2022-12-19
    • 2018-01-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多