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

相关推荐
白搞电子9 小时前
ESP-Mosaico 音乐驱动动画:节拍检测、RMS 包络与预制动作编排
ffmpeg
FlightYe12 小时前
视界原理之3D视频(三):解码和显示
android·linux·3d·ffmpeg·音视频·android runtime
FlightYe13 小时前
linux系统编程(十七):内存管理基础
android·linux·ffmpeg·音视频·android runtime
信可维14 小时前
用无头 Chrome 逐屏截图 + ffmpeg 拼竖版视频:1080×1920 全流程与 4 个坑
chrome·ffmpeg·音视频
FlightYe15 小时前
音视频修炼之容器与协议(二):HLS和DASH流媒体
android·linux·ffmpeg·音视频·android runtime·dash
GreenHandBruce16 小时前
基于Qt 6.12.0 + FFmpeg 9.0.2的4k视频播放器
qt·ffmpeg·音视频
Android系统攻城狮1 天前
Linux FFmpeg深度解析之avformat_open_input调用流程与实战(一)
linux·运维·ffmpeg·车载音视频·ffmpeg音视频·音视频进阶手册
开开心心就好2 天前
本地文件搜索工具,双击Ctrl就能呼出搜索
java·服务器·前端·支持向量机·ffmpeg·音视频·模拟退火算法
OH_TPC4 天前
【鸿蒙优选三方库】@ohos/ffmpeg-kit:把 FFmpeg 的全部能量带进鸿蒙
华为·ffmpeg·harmonyos·鸿蒙
是jin奥4 天前
最新 FFmpeg 安装脚本:Linux x86_64
linux·运维·ffmpeg