接下里,我们会用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/