ffmpeg把多个so编译成一个so

ffmpeg包含多个模块,网上的教程都是编译成多个so,libavcodec.so,libavfilter.so,libavformat.so,libavutil.so,怎么把这些so编译成一个libffmpeg.so呢?

原理是编译ffmpeg时先把各个模块编译成.a 也就是libavcodec.a,libavfilter.a,libavformat.a,libavutil.a,最后通过ndk里的clang把这些.a合并成一个.so

我目前编译使用的是开源项目https://github.com/Javernaut/ffmpeg-android-maker/

1,修改scripts\ffmpeg\build.sh

 

#!/usr/bin/env bash

case $ANDROID_ABI in
  x86)
    # Disabling assembler optimizations, because they have text relocations
    EXTRA_BUILD_CONFIGURATION_FLAGS="$EXTRA_BUILD_CONFIGURATION_FLAGS --disable-asm"
    ;;
  x86_64)
    EXTRA_BUILD_CONFIGURATION_FLAGS="$EXTRA_BUILD_CONFIGURATION_FLAGS --x86asmexe=${FAM_YASM}"
    ;;
esac

if [ "$FFMPEG_GPL_ENABLED" = true ] ; then
    EXTRA_BUILD_CONFIGURATION_FLAGS="$EXTRA_BUILD_CONFIGURATION_FLAGS --enable-gpl"
fi

# Preparing flags for enabling requested libraries
ADDITIONAL_COMPONENTS=
for LIBARY_NAME in ${FFMPEG_EXTERNAL_LIBRARIES[@]}
do
  ADDITIONAL_COMPONENTS+=" --enable-$LIBARY_NAME"
done

# Referencing dependencies without pkgconfig
DEP_CFLAGS="-I${BUILD_DIR_EXTERNAL}/${ANDROID_ABI}/include"
DEP_LD_FLAGS="-L${BUILD_DIR_EXTERNAL}/${ANDROID_ABI}/lib $FFMPEG_EXTRA_LD_FLAGS"

# Android 15 with 16 kb page size support
# https://developer.android.com/guide/practices/page-sizes#compile-r27
EXTRA_LDFLAGS="-Wl,-z,max-page-size=16384 $DEP_LD_FLAGS"

export CFLAGS="$CFLAGS -fno-optimize-sibling-calls"

./configure \
  --prefix=${BUILD_DIR_FFMPEG}/${ANDROID_ABI} \
  --enable-cross-compile \
  --target-os=android \
  --arch=${TARGET_TRIPLE_MACHINE_ARCH} \
  --sysroot=${SYSROOT_PATH} \
  --cc=${FAM_CC} \
  --cxx=${FAM_CXX} \
  --ld=${FAM_LD} \
  --ar=${FAM_AR} \
  --as=${FAM_CC} \
  --nm=${FAM_NM} \
  --ranlib=${FAM_RANLIB} \
  --strip=${FAM_STRIP} \
  --extra-cflags="-O3 -fPIC $DEP_CFLAGS" \
  --extra-ldflags="$EXTRA_LDFLAGS" \
  --disable-shared \
  --enable-static \
  --enable-pic \
  --disable-debug \
  --disable-neon \
  --disable-asm \
  --disable-vulkan \
  --enable-v4l2-m2m \
  --disable-outdev=fbdev \
  --disable-indev=fbdev \
  --disable-openssl \
  --disable-xmm-clobber-test \
  --disable-neon-clobber-test \
  --disable-programs \
  --disable-postproc \
  --disable-doc \
  --disable-htmlpages \
  --disable-manpages \
  --disable-podpages \
  --disable-txtpages \
  --disable-sndio \
  --disable-schannel \
  --disable-securetransport \
  --disable-xlib \
  --disable-cuda \
  --disable-cuvid \
  --disable-nvenc \
  --disable-vaapi \
  --disable-vdpau \
  --disable-videotoolbox \
  --disable-audiotoolbox \
  --disable-appkit \
  --disable-alsa \
  --disable-cuda \
  --disable-cuvid \
  --disable-nvenc \
  --disable-vaapi \
  --disable-vdpau \
  --disable-network \
  --disable-devices \
  --disable-ffprobe \
  --disable-ffplay \
  --disable-bsfs \
  --disable-demuxers \
  --enable-demuxer=aac,hls,mov,mp4,3gp,mpegts,h264,matroska,webm \
  --disable-muxers \
  --enable-muxer=aac,hls,mov,mp4,3gp,mpegts,h264,matroska,webm \
  --disable-decoders \
  --enable-decoder=aac,libopenh264,h264* \
  --disable-encoders \
  --enable-encoder=aac,mpeg4,libopenh264,h264* \
  --disable-filters \
  --enable-filter=null \
  --enable-filter=anull \
  --enable-filter=format \
  --enable-filter=acopy \
  --enable-filter=copy \
  --enable-filter=aformat \
  --disable-pixelutils \
  --disable-avdevice \
  --disable-swresample \
  --disable-swscale \
  --pkg-config=${PKG_CONFIG_EXECUTABLE} \
  ${EXTRA_BUILD_CONFIGURATION_FLAGS} \
  $ADDITIONAL_COMPONENTS || exit 1

${MAKE_EXECUTABLE} clean
${MAKE_EXECUTABLE} -j${HOST_NPROC}
${MAKE_EXECUTABLE} install

 

2,修改根目录里的ffmpeg-android-maker.sh 把这个文件里的.so 修改为.a

3,编译后会在output目录里生成对应abi的libavcodec.a,libavfilter.a,libavformat.a,libavutil.a

4,执行命令

/home/android-ndk-r28b/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android35-clang \
-shared \
-o libffmpeg.so \
-Wl,--whole-archive \
libavcodec.a \
libavformat.a \
libavutil.a \
libavfilter.a \
-Wl,--no-whole-archive \
-llog -lz -lm \
-Wl,--exclude-libs,libclang_rt.builtins-aarch64-android.a

会生成 libffmpeg.so

posted @ 2025-12-16 20:16  m00219907  阅读(2)  评论(0)    收藏  举报