当前位置:首页 > 技术 > 正文内容

基于Ubuntu的Android FFmpeg硬解码库构建指南

访客 技术 2026年6月9日 1

近期项目需求涉及视频渲染功能,需在Android平台实现硬件解码。常规教程多未包含libstagefright支持,经验证发现标准编译流程生成的so库缺乏该模块。本文详细记录完整编译过程及关键配置要点。

  1. 环境准备
    操作系统:Ubuntu 14.04
    开发工具:NDK-r9
    源码版本:FFMPEG 2.8.6
    需自行下载安装,建议使用最新稳定版
  2. 依赖安装
    执行以下命令安装必要组件:
    sudo apt-get install git
  3. 配置调整
    修改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)'
  4. 构建脚本配置
    在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
    
  5. 关键代码修正
    修改libavcodec/libstagefright.cpp文件,将:
    !mate

    替换为:
    mate != NULL
  6. 权限设置
    执行以下命令增加执行权限:
    chmod +x build_ffmpeg.sh
    chmod +x configure
  7. 编译流程
    执行以下命令启动编译:
    sudo ./build_ffmpeg.sh
    sudo make install

    编译完成后,会在FFMPEG目录生成android子目录,包含编译产物。

本文提供完整编译方案,包含依赖管理、配置优化及常见问题规避策略。实际使用中请根据具体需求调整参数配置。

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。