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

相关推荐
我的世界洛天依20 小时前
胡桃讲编程|混音教学系列① 第一步:音频素材怎么来?免费 + 简易方法全汇总
ffmpeg
Soari2 天前
Ziggo-Device软件构建:ERRORS
网络·ffmpeg
程序员潘子2 天前
【保姆级教程】B 站缓存 m4s 文件转 MP4,无损合成一行命令搞定
缓存·ffmpeg·ffmpeg\
山栀shanzhi2 天前
FFmpeg编码封装流程骨架
c++·ffmpeg
Ama_tor2 天前
ffmpeg的安装与配置
ffmpeg
lq12332102 天前
FFmpeg Batch AV Converter v3.2.8 视频批量转换工具
ffmpeg·音视频
鬼蛟2 天前
MySQL 调优
ffmpeg
m晴朗4 天前
ffmpeg(2)-音频相关知识
ffmpeg·音视频
山栀shanzhi4 天前
【FFmpeg实战】手撕音频转码:WAV转AAC的全链路解析与C++实现
ffmpeg·音视频·aac
深念Y5 天前
FFmpeg 480p 转码失败但 1080p/720p 正常的坑
ffmpeg·音视频·转码·流媒体·分辨率·hls·m3u8