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

相关推荐
Mister Leon17 小时前
FFmpeg - Jetson Orin 实战部署
ffmpeg
阿拉斯攀登2 天前
售货柜实战:IPC 拉流 → 抽帧 → YOLO 识别完整流水线
yolo·ffmpeg·音视频·webrtc·视频编解码
阿拉斯攀登2 天前
RTSP 拉流与录制:IPC 摄像头本地录像完整方案
ffmpeg·音视频·webrtc·实时音视频·视频编解码
坐望云起3 天前
FFmpeg.wasm 纯浏览器端视频压缩与格式转换实战:零服务器、零上传、100% 隐私
服务器·ffmpeg·wasm
阿拉斯攀登3 天前
FFmpeg 转码详解:封装格式、编码器、码率控制
ffmpeg·音视频·webrtc·实时音视频·视频编解码
阿拉斯攀登3 天前
FFmpeg 入门:命令行的 20 个常用场景
ffmpeg·音视频·webrtc·视频编解码
luoyayun3614 天前
Qt + FFmpeg 音频工具:重采样实现
qt·ffmpeg·重采样
薄荷椰果抹茶5 天前
计算机导论_第6章_笔记
笔记·ffmpeg
FlightYe6 天前
FFmpeg移动端硬解机制
linux·网络·ffmpeg·音视频·实时音视频·视频编解码
小殊小殊7 天前
一文速通GPU版FFmpeg视频转码的安装使用
ffmpeg·音视频·视频编解码