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

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下载即可。如下图所示:
NDK下载
我使用的版本是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是一种无线通信技术,虽然它常用于物联网中作为设备之间的通信手段,但它本身并不是一种感知技术 关于物联网于与互联网的区别的描述&#xff…...

分布式存储技术全景解析:从架构演进到场景实践

目录 技术演进与市场新格局核心架构设计深度剖析前沿技术创新与性能突破行业应用场景实践挑战与未来发展趋势1. 技术演进与市场新格局 1.1 从集中式到分布式的范式转移 传统集中式存储(如NAS/SAN)在扩展性和容错性方面面临根本性瓶颈,而分布式存储通过水平扩展架构和多节点…...

Hive SQL优化实践:提升大数据处理效率的关键策略

在大数据生态中,Hive作为基于Hadoop的数据仓库工具,广泛应用于海量数据的离线分析场景。然而,随着数据量的指数级增长和业务复杂度的提升,低效的Hive SQL可能导致资源浪费和查询性能瓶颈。本文将从存储优化、计算优化、资源配置三…...

LLM 使用 MCP 协议及其原理详解

LLM 使用 MCP 协议及其原理详解 🧠 一、MCP 协议概述 1. MCP 是什么? MCP(Modular Communication Protocol)是一种面向语言模型设计的通用通信协议,其设计目标是: 模块化(Modular&#xff0…...

Visual studio 中.sln/.vcxproj/.vcxproj.filters和.vcxproj.user文件的作用

在 Visual Studio (尤其是 C 项目) 中,.sln、.vcxproj、.vcxproj.filters 和 .vcxproj.user 文件各自承担着不同的关键角色。理解它们的作用对于项目管理和协作至关重要。 核心原则: .vcxproj 和 .sln 是项目/解决方案的核心定义文件,必须纳…...

小白的进阶之路系列之九----人工智能从初步到精通pytorch综合运用的讲解第二部分

张量是PyTorch中的核心数据抽象。这个交互式笔记本提供了一个深入的介绍torch. Tensor 类., 首先,让我们导入PyTorch模块。我们还将添加Python的数学模块来简化一些示例。 import torch import math创建张量 创建张量最简单的方法是调用torch.empty(): x = torch.empty(…...

NLP学习路线图(十四):词袋模型(Bag of Words)

在自然语言处理(NLP)的广阔天地中,词袋模型(Bag of Words, BoW) 宛如一块历经岁月沉淀的基石。它虽非当今最耀眼的明星,却为整个领域奠定了至关重要的基础,深刻影响了我们让计算机“理解”文本的…...

架构分享|三层存储架构加速云端大模型推理

作者简介 Nilesh Agarwal,Inferless 联合创始人&CTO 关于Inferless Inferless :无服务器 GPU 推理无需管理服务器即可扩展机器学习推理,轻松部署复杂的自定义模型。获得Sequoia、Antler 和 Blume Ventures 的支持。 大语言模型(LLM&a…...

stm与51单片机哪个更适合新手学

一句话总结 51单片机:像学骑自行车,简单便宜,但只能在小路上骑。 STM32:像学开汽车,复杂但功能强,能上高速公路,还能拉货载人(做复杂项目)。 1. 为啥有人说“先学51单片…...

OVD开放词汇检测 Detic 训练COCO数据集实践

0、引言 纯视觉检测当前研究基本比较饱和,继续创新提升空间很小,除非在CNN和transformer上提出更强基础建模方式。和文本结合是当前的一大趋势,也是计算机视觉和自然语言处理结合的未来趋势,目前和文本结合的目标检测工作还是有很…...

NodeJS全栈开发面试题讲解——P6安全与鉴权

✅ 6.1 如何防止 SQL 注入 / XSS / CSRF? 面试官您好,Web 安全三大经典问题分别从不同层面入手: 🔸 SQL 注入(Server端) 原理:恶意用户将 SQL 注入查询语句拼接,导致数据泄露或破坏…...