android - 根据我的需要减少编译后的 ffmpeg 库大小

标签 android ffmpeg java-native-interface

我终于成功构建了 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 时我得到这些文件:

enter image description here

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

另外,当前设备中最常见的 CPU 是哪个? arm v7vfpv3, arm v7vfp, arm 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

最佳答案

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

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

如果所有这些还不足以让您达到目标大小,请查看可执行加壳程序,例如 UPX .这些程序将进行 cpu/内存权衡以动态解压缩二进制文件。在某些架构上,这可以节省大量空间。

关于android - 根据我的需要减少编译后的 ffmpeg 库大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25920441/

相关文章:

android - shouldOverrideUrlLoading 不起作用

windows - FFmpeg 在 "-to"指定的时间后继续处理

ffmpeg - 管道 UDP 输入到 FFMPEG

audio - ffmpeg 音频编码器帧大小

java - Android:FastScrolling SectionIndexer getSections() 只被调用一次

android - 如何使用 ADB 终止所有 Activity 任务/应用程序?

java - 如何使用 JNI 将 Java ByteBuffer 发送到 C?

java - Maven native 插件中可笑的样板

android - Android onPreviewFrame()回调中的图片方向不正确?

Javascript 正则表达式到 Java 正则表达式