Android系统集成和使用FFmpeg
文章目录
- 前言
- FFmpeg源码下载
- 交叉编译
- NDK下载
- x264编译
- 源码下载
- 编译
- FFmpeg编译脚本
- AOSP继承FFmpeg
前言
原生AOSP中并未继承FFmpeg,所以要想在android上使用,需要自己编译集成。
FFmpeg源码下载
git clone https://git.ffmpeg.org/ffmpeg.git
目前最新的release分支是release/7.0,我们编译最新分支
git checkout release/7.0
交叉编译
我们在ubuntu系统下编译出Android系统,也就是arm平台的FFmpeg库。
NDK下载
使用Android Studio下载即可。如下图所示:

我使用的版本是25.0.8775105
x264编译
FFmpeg解码h264时需要使用x264,但是x264是单独的库,需要单独下载编译,然后集成到FFmpeg。
源码下载
git clone http://git.videolan.org/git/x264.git
编译
#!/bin/bash# 设置 NDK 路径,修改为你的 NDK 实际安装位置
export NDK=/home/zzh/Android/Sdk/ndk/25.0.8775105
export TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64# 设置目标架构和 API 级别
export API=30
export TARGET=aarch64-linux-android
export PREFIX=$(pwd)/x264_android# 设置编译器和工具链
export AR=$TOOLCHAIN/bin/llvm-ar
export AS=$TOOLCHAIN/bin/llvm-as
export CC=$TOOLCHAIN/bin/$TARGET$API-clang
export CXX=$TOOLCHAIN/bin/$TARGET$API-clang++
export LD=$TOOLCHAIN/bin/ld
export RANLIB=$TOOLCHAIN/bin/llvm-ranlib
export STRIP=$TOOLCHAIN/bin/llvm-strip
export NM=$TOOLCHAIN/bin/llvm-nm
export STRINGS=$TOOLCHAIN/bin/llvm-strings# 配置 x264 编译选项
./configure \--prefix=$PREFIX \--disable-asm \--enable-static \--enable-pic \--host=aarch64-linux-android \--cross-prefix=$TOOLCHAIN/bin/$TARGET$API- \--sysroot=$TOOLCHAIN/sysroot \--extra-cflags="-Os -fPIC" \# 检查 configure 的输出日志
if [ $? -ne 0 ]; thenecho "Configuration failed"exit 1
fi# 编译和安装
make -j$(nproc)
if [ $? -ne 0 ]; thenecho "Build failed"exit 1
fimake install
if [ $? -ne 0 ]; thenecho "Installation failed"exit 1
fiecho "x264 has been successfully built and installed"
FFmpeg编译脚本
x264会以静态库的方式集成到FFmpeg中。
#!/bin/bash# 设置NDK路径,修改为你的NDK实际安装位置
export NDK=/home/zzh/Android/Sdk/ndk/25.0.8775105
export TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64# 设置目标架构和API级别
export API=30 # 根据你的需求选择合适的API级别
export TARGET=aarch64-linux-android
export PREFIX=$(pwd)/ffmpeg_android # 输出目录# 设置编译器和工具链
export AR=$TOOLCHAIN/bin/llvm-ar
export AS=$TOOLCHAIN/bin/llvm-as
export CC=$TOOLCHAIN/bin/$TARGET$API-clang
export CXX=$TOOLCHAIN/bin/$TARGET$API-clang++
export LD=$TOOLCHAIN/bin/ld
export RANLIB=$TOOLCHAIN/bin/llvm-ranlib
export STRIP=$TOOLCHAIN/bin/llvm-strip
export NM=$TOOLCHAIN/bin/llvm-nm# 设置x264 pkg-config 路径
export PKG_CONFIG_PATH=/home/zzh/work/x264/x264_android/lib/pkgconfig:$PKG_CONFIG_PATH# 配置 FFmpeg 编译选项
echo "Configuring FFmpeg..."
./configure \--prefix=$PREFIX \--disable-static \--enable-shared \--enable-gpl \--enable-libx264 \--pkg-config="pkg-config --static" \--extra-ldflags="-L/home/zzh/work/x264/x264_android/lib" \--pkg-config-flags="--static" \--disable-doc \--disable-ffmpeg \--disable-ffplay \--disable-ffprobe \--disable-avdevice \--disable-symver \--disable-w32threads \--disable-muxer=sctp \--disable-demuxer=sctp \--disable-devices \--disable-postproc \--cross-prefix=$TOOLCHAIN/bin/$TARGET$API- \--target-os=android \--arch=aarch64 \--enable-cross-compile \--sysroot=$TOOLCHAIN/sysroot \--strip=$STRIP \--nm=$NM 2>&1 | tee configure.logif [ $? -ne 0 ]; thenecho "Configuration failed"exit 1
fi# 编译和安装
echo "Building FFmpeg..."
make -j$(nproc) 2>&1 | tee build.logif [ $? -ne 0 ]; thenecho "Build failed"exit 1
fimake install
if [ $? -ne 0 ]; thenecho "Installation failed"exit 1
fiecho "FFmpeg has been successfully built and installed"
以上编译完成后,会在ffmpeg_android目录生成编译产物。
zzh@ubuntu:~/work/ffmpeg/ffmpeg_android$ ll
total 20
drwxrwxr-x 5 zzh zzh 4096 5月 26 22:54 ./
drwxrwxr-x 19 zzh zzh 4096 5月 26 23:37 ../
drwxrwxr-x 8 zzh zzh 4096 5月 26 22:54 include/
drwxrwxr-x 3 zzh zzh 4096 5月 26 23:39 lib/
drwxrwxr-x 3 zzh zzh 4096 5月 26 22:54 share/
AOSP继承FFmpeg
集成目录如下:
zzh@ubuntu:~/work/aosp/android-13.0.0_r44/external/ffmpeg_aarch64$ ls -lh
total 16K
-rw-rw-r-- 1 zzh zzh 1.6K 5月 1 21:45 Android.bp
drwxrwxr-x 8 zzh zzh 4.0K 5月 26 23:57 include
drwxrwxr-x 3 zzh zzh 4.0K 5月 26 23:57 lib
drwxrwxr-x 3 zzh zzh 4.0K 5月 26 23:57 share
Android.bp
// 定义libavutil
cc_prebuilt_library_shared {name: "libavutil",srcs: ["lib/libavutil.so"],export_include_dirs: ["include"],strip: {none: true,},
}// 定义libswresample
cc_prebuilt_library_shared {name: "libswresample",srcs: ["lib/libswresample.so"],export_include_dirs: ["include"],shared_libs: ["libavutil",],strip: {none: true,},
}// 定义libswscale
cc_prebuilt_library_shared {name: "libswscale",srcs: ["lib/libswscale.so"],export_include_dirs: ["include"],shared_libs: ["libavutil",],strip: {none: true,},
}// 定义libavcodec
cc_prebuilt_library_shared {name: "libavcodec",srcs: ["lib/libavcodec.so"],export_include_dirs: ["include"],shared_libs: ["libavutil","libc","libm","libswresample","libz",],strip: {none: true,},
}// 定义libavformat
cc_prebuilt_library_shared {name: "libavformat",srcs: ["lib/libavformat.so"],export_include_dirs: ["include"],shared_libs: ["libavcodec","libavutil","libc","libm","libz",],strip: {none: true,},
}// 定义libavfilter
cc_prebuilt_library_shared {name: "libavfilter",srcs: ["lib/libavfilter.so"],export_include_dirs: ["include"],shared_libs: ["libavformat","libavcodec","libswresample","libswscale","libavutil",],strip: {none: true,},
}
AOSP中其他模块使用时,引用上述库即可。
相关文章:
Android系统集成和使用FFmpeg
文章目录 前言FFmpeg源码下载交叉编译NDK下载x264编译源码下载编译 FFmpeg编译脚本 AOSP继承FFmpeg 前言 原生AOSP中并未继承FFmpeg,所以要想在android上使用,需要自己编译集成。 FFmpeg源码下载 git clone https://git.ffmpeg.org/ffmpeg.git目前最新…...
水果商城外卖微信小程序模板
手机微信水果外卖,水果电商,水果商城网页小程序模板。包含:主页、列表页、详情页、购物车、个人中心。 水果商城外卖小程序模板...
【前端】面试八股文——输入URL到页面展示的过程
【前端】面试八股文——输入URL到页面展示的过程 1. DNS解析 当用户在浏览器中输入URL并按下回车时,首先需要将域名转换为IP地址,这个过程称为DNS(域名系统)解析。具体步骤如下: 浏览器缓存:浏览器首先检…...
什么是应用安全态势管理 (ASPM):综合指南
软件开发在不断发展,应用程序安全也必须随之发展。 传统的应用程序安全解决方案无法跟上当今开发人员的工作方式或攻击者的工作方式。 我们需要一种新的应用程序安全方法,而ASPM在该方法中发挥着关键作用。 什么是 ASPM? 应用程序安全…...
认识100种电路之耦合电路
在电子电路的世界中,耦合电路宛如一座精巧的桥梁,连接着各个功能模块,发挥着至关重要的作用。 【为什么电路需要耦合】 在复杂的电子系统中,不同的电路模块往往需要协同工作,以实现特定的功能。然而,这些模…...
c++【入门】三数的乘积
限制 时间限制 : 1 秒 内存限制 : 128 MB 题目 你已经学了一些程序的输入,这次,你需要在没有老师的任何帮助下完成这次的任务啦。这次任务,我们要读入三个整数,并且计算它们的乘积。 这是一个非常简单的题目,意在…...
C++实现简化版Qt的QObject(4):增加简单实用的事件机制
前面的文章已经实现了许多QObject的功能了: C实现一个简单的Qt信号槽机制 C实现简化版Qt信号槽机制(2):增加内存安全保障 C实现简化版Qt的QObject(3):增加父子关系、属性系统 但是,…...
JTracker IDEA 中最好的 MyBatis 日志格式化插件
前言 如果你使用 MyBatis ORM 框架,那么你应该用过 MyBatis Log 格式化插件,它可以让我们的程序输出的日志更人性化。 但是有一个问题,通常我们只能看到格式化后的效果,没办法知道这个 SQL 是谁执行的以及调用的链路。 如下图所…...
物联网工业级网关解决方案 工业4G路由器助力智慧生活
随着科技的飞速发展,无线通信技术正逐步改变我们的工作与生活。在这个智能互联的时代,一款高性能、稳定可靠的工业4G路由器成为了众多行业不可或缺的装备。工业4G路由器以其卓越的性能和多样化的功能,助力我们步入智慧新纪元。 一、快速转化&…...
IoTDB Committer+Ratis PMC Member:“两全其美”的秘诀是?
IoTDB & Ratis 双向深耕! 还记得一年前我们采访过拥有 IoTDB 核心研发 Ratis Committer “双重身份”的社区成员宋子阳吗?(点此阅读) 我们高兴地发现,一年后,他在两个项目都更进一步,已成为…...
【链表】- 移除链表元素
1. 对应力扣题目连接 移除链表元素 2. 实现案例代码 public class RemoveLinkedListElements {public static void main(String[] args) {// 示例 1ListNode head1 new ListNode(1, new ListNode(2, new ListNode(6, new ListNode(3, new ListNode(4, new ListNode(5, new …...
云原生之使用Docker部署RabbitMQ消息中间件
云原生之使用Docker部署RabbitMQ消息中间件 一、RabbitMQ介绍1.1 RabbitMQ简介1.2 RabbitMQ特点1.3 RabbitMQ使用场景 二、检查Docker环境2.1 检查Docker版本2.2 检查操作系统版本2.3 检查Docker状态 三、下载RabbitMQ镜像四、部署RabbitMQ服务4.1创建挂载目录4.2 运行RabbitMQ…...
opengl箱子的显示
VS环境配置: /JMC /ifcOutput "Debug\" /GS /analyze- /W3 /Zc:wchar_t /I"D:\Template\glfwtemplate\glfwtemplate\assimp" /I"D:\Template\glfwtemplate\glfwtemplate\glm" /I"D:\Template\glfwtemplate\glfwtemplate\LearnOp…...
Oracle 视图、存储过程、函数、序列、索引、同义词、触发器
优质博文:IT-BLOG-CN 一、视图 从表中抽出的逻辑上相关的数据集合,视图是一种虚表,视图是建立在已有表的基础之上,视图赖以建立的这些表称为基表。向视图提供数据的是 SELECT语句,可以将视图理解为存储起来的SELECT语…...
网站被浏览器提示“不安全”的解决办法
在互联网时代,网站的安全性直接关系到用户体验和品牌形象。当用户访问网站时,如果浏览器出现“您与此网站之间建立的连接不安全”的警告,这不仅会吓跑潜在客户,还可能对网站的SEO排名造成等负面影响。 浏览器发出的“不安全”警告…...
typescript定义函数的传参、返回值
Render 函数中定义函数传参 interface List {id: number;name: string; }interface Result {data: List[]; //表示由 List 接口组成的数组 }function Render(result: Result) {result.data.forEach(value > {console.log(value);}); }let result {data: [{id: 1,name: 张三…...
GlimmerHMM安装与使用-生信工具24
GlimmerHMM 01 概述 GlimmerHMM是一种基于广义隐马尔科夫模型(GHMM)的新型基因预测工具。虽然该基因预测工具符合GHMM的总体数学框架,但它还结合了从GeneSplicer程序中改编的剪接位点模型。可变长度的特征状态(例如外显子、内含…...
Elasticsearch架构基本原理
Elasticsearch的架构原理可以详细分为以下几个方面进行介绍: 一、Elasticsearch基本概念 Elasticsearch(简称ES)是一个基于Lucene构建的开源、分布式、RESTful搜索和分析引擎。它支持全文搜索、结构化搜索、半结构化搜索、数据分析、地理位…...
STM32自己从零开始实操08:电机电路原理图
一、LC滤波电路 其实以下的滤波都可以叫低通滤波器。 1.1倒 “L” 型 LC 滤波电路 1.1.1定性分析 1.1.2仿真实验 电感:通低频阻高频的。仿真中高频信号通过电感,因为电感会阻止电流发生变化,故说阻止高频信号 电容:隔直通交。…...
无线物联网练习题
文章目录 选择填空简答大题 选择 不属于物联网感知技术的是(A) A:ZigBee B:红外传感器 C:FRID D:传感器 ZigBee是一种无线通信技术,虽然它常用于物联网中作为设备之间的通信手段,但它本身并不是一种感知技术 关于物联网于与互联网的区别的描述ÿ…...
JPom结合Docker实现SpringBoot项目自动化构建与部署实战
1. 为什么你需要JPomDocker自动化部署方案 每次手动打包SpringBoot项目时,你是不是也经历过这样的痛苦?先在本地mvn clean package,然后scp上传到服务器,接着ssh连上去kill旧进程,最后nohup启动新jar包。更可怕的是半夜…...
太吾绘卷Mod终极指南:从零开始打造个性化游戏体验
太吾绘卷Mod终极指南:从零开始打造个性化游戏体验 【免费下载链接】Taiwu_mods 太吾绘卷游戏Mod 项目地址: https://gitcode.com/gh_mirrors/ta/Taiwu_mods 想要为《太吾绘卷》注入全新活力吗?太吾绘卷Mod为这款经典游戏带来了无限可能࿰…...
Duix.Avatar本地部署实战:从零搭建AI数字人视频生成平台
Duix.Avatar本地部署实战:从零搭建AI数字人视频生成平台 【免费下载链接】Duix-Avatar 项目地址: https://gitcode.com/GitHub_Trending/he/Duix-Avatar 你是否希望在自己的电脑上拥有一个专属的AI数字人助手?Duix.Avatar作为硅基智能推出的开源…...
HarmonyOS6 半年磨一剑 - RcCheckbox 实战下篇:问卷调查表单与参数使用指南
文章目录前言一、场景:问卷调查表单1.1 需求分析1.2 数据结构设计1.3 表单校验联动1.4 第三题:计数器与数量限制的配合1.5 结果页与状态重置1.6 三道题的样式差异化对比1.7 完整代码二、参数使用频率参考2.1 高频参数(必须掌握)2.…...
背包问题优化指南:从二维数组到一维数组的空间压缩技巧(以0-1背包为例)
背包问题优化指南:从二维数组到一维数组的空间压缩技巧(以0-1背包为例) 在算法竞赛和性能敏感的开发场景中,动态规划的空间复杂度优化往往能带来显著的性能提升。0-1背包问题作为动态规划的经典案例,其空间优化路径具…...
Abaqus纤维复合材料三点弯曲力学仿真全解析
Abaqus纤维复合材料三点弯曲力学仿真(vumat子程序inp文件obd文件视频文件快速建模软件)在材料力学的研究领域,纤维复合材料凭借其优异的性能被广泛应用。而通过Abaqus进行三点弯曲力学仿真,能有效探究其力学特性。今天咱就来唠唠这…...
Proteus仿真C51单片机:用汇编实现一个简易的脉冲计数器(附完整代码和电路图)
Proteus仿真C51单片机:用汇编实现一个简易的脉冲计数器(附完整代码和电路图) 当你第一次接触单片机编程时,可能会被各种寄存器、中断和端口配置搞得晕头转向。今天,我们就用一个实实在在的脉冲计数器项目,带…...
如何用OpCore-Simplify轻松搞定黑苹果OpenCore配置?
如何用OpCore-Simplify轻松搞定黑苹果OpenCore配置? 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 你是否曾想过自己动手装一个macOS系统…...
Java 使用国密算法实现数据加密传输
本文是混合加密:前端 SM2 SM4,后端 Spring Boot Hutool 解密的完整示例。 方案的逻辑是: 前端随机生成一个 SM4 key 用 SM4 加密整个业务 JSON 用后端提供的 SM2 公钥 加密这个 SM4 key 后端先用 SM2 私钥 解出 SM4 key 再用 SM4 解出…...
不止于画图:用@antv/g6-editor的Command系统打造可撤销/重做的智能流程设计器
超越基础绘图:利用antv/g6-editor构建企业级智能流程设计器 在当今快速发展的数字化时代,流程设计工具已成为企业数字化转型的核心组件。从简单的审批流程到复杂的业务编排,一个功能完备的流程设计器不仅能提升工作效率,更能确保…...
