将FFmpeg集成到aosp

接下里,我们会用ffmpeg实现codec2组件,这一讲先将ffmpeg集成到aosp中,以便以后我们接封装和编解码

在external中新建ffmpeg目录,下载ndk解压到该目录,形成创建如下的目录:

ffmpeg/

├── build/

│ ├── gen_ffmpeg_config.sh

│ └── android-ndk-r27d/

└── upstream/

└── (存放ffmpeg源码)

gen_ffmpeg_config.sh实现如下,主要是利用了NDK将ffmpeg进行编译

复制代码
   #!/bin/bash
   set -euo pipefail
   
   if [ $# -lt 2 ]; then
       echo "Usage: $0 <ndk_root> <arch>"
       echo "Example: $0 /opt/android-ndk-r26d arm64"
       exit 1
   fi
   
   NDK_ROOT="$(cd ./android-ndk-r27d && pwd)"
   ARCH="$2"
   
   FFMPEG_SRC="$(cd "$(dirname "$0")/../upstream" && pwd)"
   OUT_ROOT="$(cd "$(dirname "$0")" && pwd)/prebuilt/android/${ARCH}"
   BUILD_DIR="$(cd "$(dirname "$0")" && pwd)/.build_${ARCH}"
   
   TOOLCHAIN="$NDK_ROOT/toolchains/llvm/prebuilt/linux-x86_64"
   SYSROOT="$TOOLCHAIN/sysroot"
   
   if [ ! -d "$TOOLCHAIN" ]; then
       echo "ERROR: toolchain not found: $TOOLCHAIN"
       exit 1
   fi
   
   mkdir -p "$BUILD_DIR"
   rm -rf "$BUILD_DIR"/*
   mkdir -p "$OUT_ROOT"
   
   case "$ARCH" in
       arm64)
           TARGET_ARCH="aarch64"
           TARGET_CPU="armv8-a"
           API=30
           CC="$TOOLCHAIN/bin/aarch64-linux-android${API}-clang"
           CXX="$TOOLCHAIN/bin/aarch64-linux-android${API}-clang++"
           ;;
       arm)
           TARGET_ARCH="arm"
           TARGET_CPU="armv7-a"
           API=30
           CC="$TOOLCHAIN/bin/armv7a-linux-androideabi${API}-clang"
           CXX="$TOOLCHAIN/bin/armv7a-linux-androideabi${API}-clang++"
           ;;
       x86)
           TARGET_ARCH="x86"
           TARGET_CPU="i686"
           API=30
           CC="$TOOLCHAIN/bin/i686-linux-android${API}-clang"
           CXX="$TOOLCHAIN/bin/i686-linux-android${API}-clang++"
           ;;
       x86_64)
           TARGET_ARCH="x86_64"
           TARGET_CPU="x86-64"
           API=30
           CC="$TOOLCHAIN/bin/x86_64-linux-android${API}-clang"
           CXX="$TOOLCHAIN/bin/x86_64-linux-android${API}-clang++"
           ;;
       *)
           echo "ERROR: unsupported arch: $ARCH"
           exit 1
           ;;
   esac
   
   AR="$TOOLCHAIN/bin/llvm-ar"
   NM="$TOOLCHAIN/bin/llvm-nm"
   STRIP="$TOOLCHAIN/bin/llvm-strip"
   RANLIB="$TOOLCHAIN/bin/llvm-ranlib"
   
   PREFIX="$OUT_ROOT"
   
   cd "$BUILD_DIR"
   
   unset CFLAGS CXXFLAGS CPPFLAGS LDFLAGS ASFLAGS LDLIBS OBJCFLAGS OBJCXXFLAGS
   
   "$FFMPEG_SRC/configure" \
       --prefix=out \
       --libdir=out/lib \
       --enable-cross-compile \
       --enable-neon \
       --enable-debug \
       --enable-symver \
       --enable-static \
       --disable-shared \
       --disable-stripping \
       --disable-doc \
       --disable-hwaccels \
       --disable-avdevice \
       --disable-vulkan \
       --disable-mediacodec \
       --disable-ffmpeg \
       --disable-ffplay \
       --disable-ffprobe \
       --target-os=android \
       --arch=${TARGET_ARCH} \
       --cc=$CC \
       --cxx=$CXX \
       --strip=$STRIP \
       --extra-cflags="-D__ANDROID__ -ggdb3" \
       --extra-ldflags="-g" || {
           echo "==== configure failed ===="
           [ -f ffbuild/config.log ] && cat ffbuild/config.log
           [ -f config.log ] && cat config.log
           exit 1
       }
   
   make -j"$(nproc)"
   make install
   
   echo "Done. Output:"
   echo "  $BUILD_DIR/out/lib mv to $ANDROID_BUILD_TOP/vendor/zlsmart/proprietary/media/ffmpeg/android/"
   echo "  $BUILD_DIR/out/include mv to $ANDROID_BUILD_TOP/vendor/zlsmart/proprietary/media/ffmpeg/android/"
   
   cp -rf $BUILD_DIR/out/lib/ $ANDROID_BUILD_TOP/vendor/zlsmart/proprietary/media/ffmpeg/android/
   cp -rf $BUILD_DIR/out/include/ $ANDROID_BUILD_TOP/vendor/zlsmart/proprietary/media/ffmpeg/android/

在build目录下,执行以下命令,编译ffmpeg源码生成文件

cpp 复制代码
./gen_ffmpeg_config.sh ./android-ndk-r27d arm64

之后会将编译出来的include文件和.a静态库拷贝到

cpp 复制代码
vendor/{company}/proprietary/media/ffmpeg/android

在该目录下,形成如下结构,之后我们会利用该目录下的库和头文件进行开发

media/

└── ffmpeg/

└── android/

├── include/

└── lib/

相关推荐
狄林可16 小时前
从付费软件到自主开发:我用AI和FFmpeg实现了一个录屏工具
人工智能·ffmpeg
没有余地 EliasJie2 天前
FFmpeg介绍与ESP32资源受限下的视频流传输优化策略
单片机·物联网·ffmpeg
不想看见4042 天前
Qt+FFmpeg 极简播放器示例【音视频方向简单讲解】
qt·ffmpeg·音视频
郭涤生2 天前
FFmpeg 最常用的 200 条命令分类整理
ffmpeg
yikegis2 天前
TOP 5 在线音频剪辑软件 免费(2026)
人工智能·ffmpeg·音视频·语音识别·学习方法·canva可画
无巧不成书02184 天前
FFmpeg 保姆级安装教程!Windows/macOS/Linux全平台覆盖,
windows·macos·ffmpeg
kkoral6 天前
OpenCV 与 FFmpeg 的关系
opencv·ffmpeg
kkoral6 天前
如何在 Python 中使用 OpenCV 调用 FFmpeg 的特定功能?
python·opencv·ffmpeg
山栀shanzhi6 天前
【FFmpeg】音视频MP4封装格式转封装MOV
ffmpeg·音视频