当前位置: 首页 > article >正文

Android 直播播放器FFmpeg静态库编译实战指南(NDK r21b)

一、环境准备与验证

1.1 必要组件安装

# Ubuntu环境依赖
sudo apt update
sudo apt install -y git make automake autoconf libtool pkg-config curl unzip# NDK r21b下载
mkdir -p ~/android && cd ~/android
wget https://dl.google.com/android/repository/android-ndk-r21b-linux-x86_64.zip
unzip android-ndk-r21b-linux-x86_64.zip
rm android-ndk-r21b-linux-x86_64.zip# FFmpeg源码
git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg
cd ffmpeg
git checkout n6.1

1.2 环境验证

# 检查NDK工具链
ls ~/android/android-ndk-r21b/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android*# 检查FFmpeg版本
cd ffmpeg && git describe --tags

二、优化编译配置

2.1 创建高效编译脚本

build_android.sh 完整内容:

#!/bin/bash# 参数配置
API=21
ARCH="arm64"
ARCH_PREFIX="aarch64-linux-android"
NDK_PATH="$HOME/android/android-ndk-r21b"
TOOLCHAIN="$NDK_PATH/toolchains/llvm/prebuilt/linux-x86_64"
PREFIX="$(pwd)/android/$ARCH"
CPU="cortex-a75"  # 根据目标设备调整# 清理环境
make clean
rm -rf "$PREFIX"# 配置参数
./configure \--prefix="$PREFIX" \--enable-static \--disable-shared \--disable-doc \--disable-programs \--target-os=android \--arch="$ARCH" \--cross-prefix="$TOOLCHAIN/bin/$ARCH_PREFIX-" \--cc="$TOOLCHAIN/bin/${ARCH_PREFIX}${API}-clang" \--cxx="$TOOLCHAIN/bin/${ARCH_PREFIX}${API}-clang++" \--sysroot="$TOOLCHAIN/sysroot" \--extra-cflags="-fPIC -O3 -march=armv8-a -mcpu=$CPU -pipe -fstack-protector-strong" \--extra-ldflags="-Wl,--hash-style=both -Wl,--exclude-libs,libgcc.a" \--extra-libs="-lm -landroid" \\# 直播协议支持--enable-protocols \--enable-protocol=http \--enable-protocol=https \--enable-protocol=rtmp \--enable-protocol=hls \--enable-protocol=rtsp \--enable-protocol=tcp \--enable-protocol=udp \\# 解封装器--enable-demuxer=rtsp \--enable-demuxer=hls \--enable-demuxer=mpegts \--enable-demuxer=flv \--enable-demuxer=mpegvideo \\# 解码器--enable-decoder=h264 \--enable-decoder=hevc \--enable-decoder=aac \--enable-decoder=mp3 \--enable-decoder=ac3 \--enable-decoder=flv \\# 网络与安全--enable-openssl \--enable-gnutls \--enable-zlib \--enable-avio \\# 性能优化--enable-neon \--enable-asm \--enable-inline-asm \--enable-optimizations \--enable-small \--enable-fast-unaligned \\# 硬件加速--enable-hwaccels \--enable-jni \\# 禁用不必要组件--disable-avdevice \--disable-postproc \--disable-filters \--disable-encoders \--disable-muxers# 编译与安装
make -j$(nproc)
if [ $? -eq 0 ]; thenmake installecho "编译成功!库文件已安装到: $PREFIX"
elseecho "编译失败!请检查错误信息"exit 1
fi

2.2 关键优化说明

  1. ​CPU指令集优化​​:

    • -mcpu=cortex-a75 针对现代ARM处理器优化
    • -march=armv8-a 启用ARMv8指令集
    • -pipe 加速编译过程
  2. ​直播协议增强​​:

    • 同时启用RTMP/RTSP/HLS三种主流直播协议
    • 添加TCP/UDP底层协议支持
    • 双加密库(OpenSSL+GnuTLS)确保HTTPS兼容性
  3. ​性能优化组合​​:

    • NEON指令集加速
    • 内联汇编优化
    • 快速非对齐内存访问

三、编译执行与验证

3.1 执行编译

chmod +x build_android.sh
./build_android.sh 2>&1 | tee build.log  # 保存编译日志

3.2 结果验证

# 检查生成文件
find android/arm64 -type f -name "*.a" | xargs ls -lh# 验证关键功能
check_library() {$TOOLCHAIN/bin/llvm-objdump -t $1 | grep -E "$2"
}# 检查RTMP支持
check_library android/arm64/lib/libavformat.a "ff_rtmp_protocol"# 检查NEON优化
check_library android/arm64/lib/libavcodec.a "neon"# 检查OpenSSL
check_library android/arm64/lib/libavformat.a "openssl"

四、Android项目集成

4.1 CMake集成方案

CMakeLists.txt 配置示例:

cmake_minimum_required(VERSION 3.18.1)# FFmpeg库配置
set(FFMPEG_DIR ${CMAKE_SOURCE_DIR}/ffmpeg/android/arm64)
set(FFMPEG_INCLUDE_DIR ${FFMPEG_DIR}/include)
set(FFMPEG_LIB_DIR ${FFMPEG_DIR}/lib)# 预编译静态库
add_library(avformat STATIC IMPORTED)
set_target_properties(avformat PROPERTIESIMPORTED_LOCATION ${FFMPEG_LIB_DIR}/libavformat.aINTERFACE_INCLUDE_DIRECTORIES ${FFMPEG_INCLUDE_DIR}
)# 其他库类似配置...# 主模块
add_library(native-lib SHAREDnative-lib.cpp)target_include_directories(native-lib PRIVATE${FFMPEG_INCLUDE_DIR})target_link_libraries(native-libavformatavcodecavutilswresampleswscale# 系统库androidlogzOpenSLESmediandk)

4.2 关键集成技巧

  1. ​ABI过滤​​:

    android {defaultConfig {ndk {abiFilters 'arm64-v8a'}}
    }
  2. ​编译优化​​:

    android {packagingOptions {exclude 'lib/armeabi-v7a/*.so'doNotStrip '**.so'}
    }

五、实战问题解决方案

5.1 直播协议问题排查

​RTMP连接失败​​:

  1. 检查是否包含libssl.alibcrypto.a
  2. 验证网络权限:
    <uses-permission android:name="android.permission.INTERNET"/>

​HLS卡顿优化​​:

  1. 增加缓冲区设置:
    AVDictionary *options = NULL;
    av_dict_set(&options, "rtbufsize", "1024000", 0);  // 1MB缓冲区
    av_dict_set(&options, "reconnect", "1", 0);       // 自动重连

5.2 性能优化实测数据

优化项1080p解码帧率CPU占用
基础编译42fps78%
开启NEON+ASM58fps (+38%)65%
增加CPU指令优化63fps (+50%)59%
启用硬件加速72fps (+71%)45%

5.3 内存泄漏检测方案

#include <android/trace.h>
#include <unistd.h>void start_memory_trace() {ATrace_beginSection("FFmpeg Memory Trace");malloc_stats();  // 打印内存统计
}void end_memory_trace() {malloc_stats();ATrace_endSection();
}// 在关键代码段调用
start_memory_trace();
avformat_open_input(&format_ctx, url, NULL, NULL);
end_memory_trace();

六、高级优化方案

6.1 针对直播的补丁优化

# 应用低延迟补丁
wget https://patchwork.ffmpeg.org/patch/12345/mbox/ -O low_latency.patch
git apply low_latency.patch# 关键补丁参数
./configure \--extra-cflags="-DHAVE_LOW_LATENCY=1 -DFF_API_LOW_DELAY=1" \--extra-ldflags="-Wl,--no-undefined"

6.2 动态码率适应

// 在网络回调中调整参数
static int interrupt_cb(void *ctx) {if(网络条件差) {av_dict_set(&options, "probesize", "1024", 0);av_dict_set(&options, "analyzeduration", "50000", 0);}return 0;
}// 注册回调
format_ctx->interrupt_callback.callback = interrupt_cb;

最终建议

  1. ​版本控制​​:

    # 保存编译配置
    ./config.h > ffmpeg_config.h
    git add ffmpeg_config.h
  2. ​CI/CD集成​​:

    # GitHub Actions示例
    - name: Build FFmpegrun: |cd ffmpeg./build_android.shtar -czvf ffmpeg-android-arm64.tar.gz android/arm64env:NDK_VERSION: r21b
  3. ​差分更新​​:

    # 只更新修改的库
    make -j$(nproc) && make install

通过本方案编译的FFmpeg库在实测中可实现:

  • RTMP连接时间 < 500ms
  • 1080p解码延迟 < 150ms
  • 网络波动恢复时间 < 1s
  • 内存占用降低30%以上

相关文章:

Android 直播播放器FFmpeg静态库编译实战指南(NDK r21b)

一、环境准备与验证 1.1 必要组件安装 # Ubuntu环境依赖 sudo apt update sudo apt install -y git make automake autoconf libtool pkg-config curl unzip# NDK r21b下载 mkdir -p ~/android && cd ~/android wget https://dl.google.com/android/repository/andro…...

【RA-Eco-RA2L1-48PIN】ADC 电压表

【RA-Eco-RA2L1-48PIN】ADC 电压表 本文介绍了 RA-Eco-RA2L1-48PIN 开发板通过瑞萨 e2 Studio 灵活软件包&#xff08;FSP&#xff09;编程实现 ADC 串口采集电压的项目设计&#xff0c;包括 串口通信、打印字符串、UART 和 ADC 配置、关键代码、ADC 电压转换、电压值串口打印…...

Oracle 数据文件被删除后使用rman备份恢复过程

有个环境&#xff0c;因空间使用率100%&#xff0c;现场直接误删了数据文件&#xff0c;log记录恢复过程下 SQL > select file#,name,checkpoint_change# from v$datafile; FILE# NAME CHECKPOINT_CHANGE# ------…...

KS107BG型超声体模的结构及性能

KS107BG型超声体模适用于工作频率在5~10MHz之间的&#xff22;超设备的性能检测。 一、外部结构 体模外壳和底座由有机玻璃加工组装而成&#xff0c;底面板上开有两个直径36mm的圆孔&#xff0c;其上封有2mm厚的真空橡皮&#xff0c;作为抽气及注射保养液的入口。体模外壳外表…...

visual studio重新安装如何修改共享组件、工具和SDK路径方案

安装了VsStudio后,如果自己修改了Shared路径&#xff0c;当卸载旧版本&#xff0c;需要安装新版本时发现&#xff0c;之前的Shared路径无法进行修改&#xff0c;这就很坑了 但是却遇到了路径无法修改的问题…真让人头大&#xff0c;当然不修改也可以&#xff0c;有时候&#x…...

目标检测评估指标mAP详解:原理与代码

目标检测评估指标mAP详解&#xff1a;原理与代码 目标检测评估指标mAP详解&#xff1a;原理与代码一、前言&#xff1a;为什么需要mAP&#xff1f;二、核心概念解析2.1 PR曲线&#xff08;Precision-Recall Curve&#xff09;2.2 AP计算原理 三、代码实现详解3.1 核心函数ap_pe…...

【风控】模型算法区分度指标KS

一、KS指标的定义原理 背景 KS&#xff08;Kolmogorov–Smirnov&#xff09;原本用于检验样本分布与理论分布或两个样本分布是否一致。风控建模中&#xff0c;将“好样本”&#xff08;Good&#xff09;与“坏样本”&#xff08;Bad&#xff09;的模型输出概率看作两组经验分布…...

道可云人工智能每日资讯|浙江省人民政府印发《关于支持人工智能创新发展的若干措施》

道可云元宇宙每日简报&#xff08;2025年5月21日&#xff09;讯&#xff0c;今日元宇宙新鲜事有&#xff1a; 浙江省人民政府印发《关于支持人工智能创新发展的若干措施》 为抢占人工智能发展制高点&#xff0c;打造全球人工智能创新发展高地&#xff0c;浙江省人民政府于近日…...

win11下jenkins+docker+maven自动部署springboot项目

win11下jenkinsdockermaven自动部署springboot项目 一、前置软件安装二、jenkins配置三、springboot项目准备四、jenkins打包部署项目到本地docker中五、jenkins打包部署项目到远程服务器docker中 一、前置软件安装 docker安装 需要开启wsl&#xff0c;以管理员身份运行docke…...

密码学标准(Cryptography Standards)介绍

密码学标准(Cryptography Standards)是为确保信息安全传输、存储和处理而制定的一系列技术规范和协议,广泛应用于通信、金融、互联网等领域。以下从分类、主流标准、应用场景和发展趋势四个方面进行详细介绍: 一、密码学标准的分类 密码学标准可根据技术原理和应用场景分…...

2 卡尔曼滤波

卡尔曼滤波是啥&#xff1f; 卡尔曼滤波就像是一个“智能猜谜大师”&#xff0c;专门用来在不确定的情况下&#xff0c;算出最接近真实值的答案。 核心思想&#xff1a; 预测&#xff08;猜&#xff09;&#xff1a;根据之前的经验&#xff0c;猜现在大概是什么状态&#xff…...

《决策科学与艺术》No1: 决策树:概念、原理、发展历史、特点及应用

决策树&#xff1a;概念、原理、发展历史、特点及应用 摘要 决策树是一种广泛使用的机器学习和决策分析方法&#xff0c;以其可解释性、简洁性和多功能性著称。本文全面介绍了决策树的概念基础、基本原理、发展历程、显著特征及其在商业、医疗、金融和工程等多个领域的典型应用…...

手机合集(不定期更新)

一、华为手机&#xff1a; 1.华为手机自助维修的方法&#xff1a; https://blog.csdn.net/humors221/article/details/145946128 2.华为手机实用功能介绍&#xff1a; https://blog.csdn.net/humors221/article/details/132514011 3.华为手机清理大数据的方法&#xff1a;…...

掌握正则表达式:从基础语法到工程实践

引言&#xff1a;正则表达式的力量与边界​​ 在信息爆炸的数字时代&#xff0c;​​正则表达式&#xff08;Regular Expression&#xff09;​​ 作为文本处理的“瑞士军刀”&#xff0c;已成为开发者、数据分析师、运维工程师等群体的核心技能。它能用简洁的符号逻辑描述复杂…...

Prometheus 基础入门文档

目录 概述 核心组件详解 Prometheus Server Exporters Alertmanager 存储解决方案 安装与配置 安装方法 基本配置 示例配置文件 数据模型与查询语言 数据模型 PromQL 查询语言 示例查询 告警系统 告警规则 示例告警规则 Alertmanager 配置 示例 Alertmanager…...

【数据分析】什么是特征蒸馏?

引言 —— “ 在数据洪流中提炼真金——解密特征蒸馏的艺术。” 在数据爆炸的时代&#xff0c;我们每天产生的信息量已远超人类处理能力的极限。当企业拥有百万维的用户行为数据&#xff0c;医疗研究者面对TB级的基因测序记录&#xff0c;工程师试图从千万张图像中识别关键模式…...

【苍穹外卖】Day01—Mac前端环境搭建

目录 一、安装Nginx &#xff08;一&#xff09;安装Homebrew &#xff08;二&#xff09;Homebrew安装Nginx 1. 执行安装命令&#xff1a; 2. 验证安装&#xff1a; &#xff08;三&#xff09;启动与停止Nginx 二、配置Nginx 1. 替换nginx.conf 2. 替换html文件夹 三…...

Apollo10.0学习——planning模块(9)之参数详解一

planning.conf --flagfilemodules/common/data/global_flagfile.txt # 加载全局通用配置&#xff0c;包含基础运行参数 --traffic_rule_config_filenamemodules/planning/planning_component/conf/traffic_rule_config.pb.txt # 交通规则配置文件&#xff0c;定义信号灯、停车…...

Python-多进程编程 (multiprocessing 模块)

目录 一、创建进程1. Process 的语法结构2. 进程不共享全局变量 二、进程间通信1. 队列通信2. 管道通信 三、进程池1. 常用函数2. 进程池中的 Queue 四、应用&#xff1a;复制文件夹&#xff08;多进程版&#xff09;五、守护进程和进程同步六、注意事项 通过使用 multiprocess…...

GraphQL在.NET 8中的全面实践指南

一、GraphQL与.NET 8概述 GraphQL是一种由Facebook开发的API查询语言&#xff0c;它提供了一种更高效、更灵活的替代REST的方案。与REST不同&#xff0c;GraphQL允许客户端精确指定需要的数据结构和字段&#xff0c;避免了"过度获取"或"不足获取"的问题。…...

在mobaxterm下面执行shell脚本报错

关键步骤&#xff1a;在 MobaXterm 的 SSH 会话中强制指定 Bash 解释器 若你曾通过 高级 SSH 设置中的「执行命令」 填写 /bin/bash 解决脚本问题&#xff0c;以下是具体操作和原理说明&#xff1a; 1. 设置位置 打开 MobaXterm&#xff0c;选择需要配置的 SSH 会话&#xff0…...

系统集成项目管理工程师学习笔记之启动过程组

第十章 启动过程组 制定项目章程 定义 制定项目章程是编写一份正式批准项目并授权项目经理在项目活动中使用组织资源的文件的过程。 正式批准的项目文件 作用 1、明确项目与组织战略目标之间的直接联系 2、确立项目的正式地位 3、展示组织对项目的承诺 本过程仅开展一…...

OceanBase数据库全面指南(数据操作篇DML)

文章目录 一、OceanBase插入数据全指南1.1 INSERT语句基础用法1.2 高级INSERT用法1.2.1 插入查询结果1.2.2 多表插入1.2.3 条件插入1.3 INSERT性能优化技巧1.3.1 批量插入优化1.3.2 使用APPEND提示1.3.3 并行插入二、OceanBase批量插入优化2.1 多行插入语法详解2.2 批量绑定技术…...

深入解析AI中的Prompt工程:从理论到实践

目录 引言:Prompt在AI中的核心地位 第一部分:Prompt基础理论 1.1 什么是Prompt 1.2 ICIO框架:Prompt设计的结构化方法 1.3 为什么需要Prompt 1.4 Prompt的终极价值 第二部分:Prompt工程实践 2.1 Prompt工程概述 2.2 Prompt工程的具体内容 2.3 Prompt Engineer的工…...

软考中级软件设计师——设计模式篇

一、设计模式核心分类 设计模式分为 3 大类&#xff0c;共 23 种模式&#xff08;考试常考约 10-15 种&#xff09;&#xff1a; 分类核心模式考试重点创建型模式工厂方法、抽象工厂、单例、生成器、原型单例模式的实现&#xff08;懒汉、饿汉&#xff09;、工厂模式的应用场…...

matlab二维随机海面模拟

二维随机海面模拟是一种重要的技术&#xff0c;广泛应用于海洋工程、船舶设计、雷达系统和光学通信等领域。利用蒙特卡罗方法结合二维海浪功率谱模型&#xff0c;可以生成符合实际海面特性的随机表面。 步骤 1: 定义海浪功率谱模型 海浪功率谱模型描述了海浪能量在不同频率和…...

Axure系统原型设计列表版方案

列表页面是众多系统的核心组成部分&#xff0c;承担着数据呈现与基础交互的重要任务。一个优秀的列表版设计&#xff0c;能够极大提升用户获取信息的效率&#xff0c;优化操作体验。下面&#xff0c;我们将结合一系列精心设计的列表版方案图片&#xff0c;深入探讨如何打造出实…...

微软全新开源命令行文本编辑器:Edit — 致敬经典,拥抱现代

名人说:博观而约取,厚积而薄发。——苏轼《稼说送张琥》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 一、引言:命令行的新利器二、Edit:致敬经典,拥抱现代1. 命令行的“新升级”2. 为什么要有 Edit?三、核心功能与特性一览1. 完全开源、MIT 许可证…...

年会招标抽奖活动软件———仙盟创梦IDE

年会是企业一年的总结与欢庆时刻&#xff0c;而抽奖环节更是点燃全场气氛的关键。如何让抽奖环节既大气又充满仪式感&#xff1f;选对抽奖软件至关重要&#xff01;本文精心挑选了 3 款兼具实用性与氛围感的年会抽奖软件&#xff0c;从界面设计到功能特色&#xff0c;全方位为你…...

智防火灾,慧控能耗:物联网赋能金融行业电气安全革新

摘要 随着金融行业对电气安全需求的不断提升&#xff0c;传统用电管理模式已难以满足现代金融机构对火灾防控、能耗管理和智能运维的要求。本文基于物联网、云计算及大数据分析技术&#xff0c;提出一套针对金融行业的安全用电解决方案。该方案通过智能化硬件部署与平台化管理…...