将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/

相关推荐
企业数字化笔记5 小时前
视觉处理为什么会慢?解码、预处理、模型推理、后处理和编码的性能拆解
ffmpeg·gpu算力
Maynor9961 天前
6张商品图→17秒带货短视频:开源12个Claude Skills,配音、字幕花字、BGM本地一条命令出片
ffmpeg·ai编程·claude·电商·agent skills
AIGC小尼1 天前
8G 显存零基础本地部署 AI 漫剧全流程|ComfyUI+Wan2.2+FFmpeg 离线成片完整方案(含代码 / 指令 / 排坑)
人工智能·ffmpeg·php·comfyui·ai漫剧
开开心心就好1 天前
以图搜图找重复图片,本地工具离线就能用
javascript·智能手机·ffmpeg·c#·ocr·word·音视频
可乐鸡翅yeah_2 天前
AES‑128 加密 M3U8,IV 初始化向量新手容易踩坑
前端·网络·数据库·ffmpeg·音视频·m3u8在线
企业数字化笔记3 天前
视频视觉任务怎样选择媒体处理技术?FFmpeg、OpenCV、GStreamer 的职责与适用场景
ffmpeg·音视频·媒体
可乐鸡翅yeah_4 天前
网页端 M3U8 播放器性能监控,怎么看播放卡顿指标
javascript·ffmpeg·音视频·safari·m3u8
开开心心就好4 天前
超市定时播音软件,免费版支持循环播放
智能手机·ffmpeg·ocr·word·vim·音视频·visual studio
企业数字化笔记4 天前
视频成片怎么稳定导出?编码选择、GPU/CPU降级与媒体交付验收
java·python·ffmpeg
企业数字化笔记4 天前
视觉智能体怎么选技术?目标检测、跟踪、分割、OpenCV和FFmpeg的职责划分
opencv·目标检测·ffmpeg