基于Ubuntu的Android FFmpeg硬解码库构建指南
近期项目需求涉及视频渲染功能,需在Android平台实现硬件解码。常规教程多未包含libstagefright支持,经验证发现标准编译流程生成的so库缺乏该模块。本文详细记录完整编译过程及关键配置要点。
- 环境准备
操作系统:Ubuntu 14.04
开发工具:NDK-r9
源码版本:FFMPEG 2.8.6
需自行下载安装,建议使用最新稳定版 - 依赖安装
执行以下命令安装必要组件:
sudo apt-get install git - 配置调整
修改FFMPEG源码目录下的configure文件,完成以下变更:
- 启用libstagefright模块:将
enabled libstagefright_h264 && require_cpp libstagefright_h264改为enabled libstagefright && require_cpp libstagefright_h264 - 优化库文件生成策略:替换原有库路径配置为:
SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)' LIB_INSTALL_EXTRA_CMD='$$(RANLIB)"$(LIBDIR)/$(LIBNAME)"' SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)' SLIB_INSTALL_LINKS='$(SLIBNAME)'
- 启用libstagefright模块:将
- 构建脚本配置
在FFMPEG目录创建构建脚本(如build_ffmpeg.sh),内容如下:
#!/bin/bash export ANDROID_NDK_ROOT=/opt/android/android-ndk-r9 SYSROOT=$ANDROID_NDK_ROOT/platforms/android-9/arch-arm/ TOOLCHAIN=$ANDROID_NDK_ROOT/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64 git clone --depth=1 --branch gingerbread-release https://github.com/CyanogenMod/android_frameworks_base.git ../android-source/frameworks/base git clone --depth=1 --branch gingerbread-release https://github.com/CyanogenMod/android_system_core.git ../android-source/system/core if [ ! -d "../android-libs" ]; then if [ ! -f "../update-cm-7.0.3-N1-signed.zip" ]; then wget http://download.cyanogenmod.com/get/update-cm-7.0.3-N1-signed.zip -P../ fi unzip ../update-cm-7.0.3-N1-signed.zip system/lib/* -d../ mv ../system/lib ../android-libs rmdir ../system fi function build_one { ./configure \ --prefix=$PREFIX \ --enable-shared \ --disable-static \ --enable-libstagefright-h264 \ --disable-doc \ --disable-ffserver \ --enable-cross-compile \ --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \ --target-os=linux \ --arch=arm \ --sysroot=$SYSROOT \ --extra-cflags="-Os -fpic $ADDI_CFLAGS $EXTRA_CFLAGS" \ --extra-ldflags="$ADDI_LDFLAGS $EXTRA_LDFLAGS" \ --extra-cxxflags="$EXTRA_CXXFLAGS" \ $ADDITIONAL_CONFIGURE_FLAG } ANDROID_SOURCE=../android-source ANDROID_LIBS=../android-libs ABI="armeabi-v7a" EXTRA_CFLAGS="-I$ANDROID_SOURCE/frameworks/base/include -I$ANDROID_SOURCE/system/core/include" EXTRA_CFLAGS="$EXTRA_CFLAGS -I$ANDROID_SOURCE/frameworks/base/media/libstagefright" EXTRA_CFLAGS="$EXTRA_CFLAGS -I$ANDROID_SOURCE/frameworks/base/include/media/stagefright/openmax" EXTRA_CFLAGS="$EXTRA_CFLAGS -I$ANDROID_NDK_ROOT/sources/cxx-stl/gnu-libstdc++/4.8/include -I$ANDROID_NDK_ROOT/sources/cxx-stl/gnu-libstdc++/4.8/libs/$ABI/include" EXTRA_CFLAGS="$EXTRA_CFLAGS -march=armv7-a -mfloat-abi=softfp -mfpu=neon" EXTRA_LDFLAGS="-Wl,--fix-cortex-a8 -L$ANDROID_LIBS -Wl,-rpath-link,$ANDROID_LIBS -L$ANDROID_NDK_ROOT/sources/cxx-stl/gnu-libstdc++/4.8/libs/$ABI -lstagefright -lstdc++ -lutils -lbinder -lgnustl_static -lgnustl_shared" EXTRA_CXXFLAGS="-Wno-multichar -fno-exceptions -fno-rtti" CPU=armeabi-v7a PREFIX=$(pwd)/android/$CPU ADDI_CFLAGS="-marm" build_one make clean make -j4 || exit 1 - 关键代码修正
修改libavcodec/libstagefright.cpp文件,将:
!mate
替换为:
mate != NULL - 权限设置
执行以下命令增加执行权限:
chmod +x build_ffmpeg.sh chmod +x configure - 编译流程
执行以下命令启动编译:
sudo ./build_ffmpeg.sh sudo make install
编译完成后,会在FFMPEG目录生成android子目录,包含编译产物。
本文提供完整编译方案,包含依赖管理、配置优化及常见问题规避策略。实际使用中请根据具体需求调整参数配置。