使用Ubuntu编译FFmpeg生成Android动态库/静态库
环境
我这里使用windows里的wsl2的ubuntu,使用物理机或者vmware,vbox之类的安装的ubuntu理论上也可以.
gcc编译使用的环境如下:
Ndk使用17
FFmpeg使用4.0.2.
clang编译使用的环境如下:
Ndk使用21.4
FFmpeg使用6.1
FFmpeg下载地址:https://ffmpeg.org/releases/
Ndk下载地址在Android官网
准备
把下载到的FFmpeg,ndk解压,注意ndk下载的是linux版本的,因为接下来会在ubuntu下编译
编写编译脚本
由于Ndk在17或以下的版本默认使用Gcc编译而17以上的版本使用Clang所以这里介绍两种编译方式。
Gcc编译
编写sh脚本
由于编译的命令并非一两条命令可以完成的所以我们需要使用.sh脚本保存起来,编写完成之后执行该脚本
在ffmpeg源码根目录新建一个.sh后缀的文件,我这里的命名为ffbuild.sh。以下为该文件的内容
# NDK目录
NDK_ROOT=/mnt/c/Users/Administrator/ubuntu_dev/ndk/android-ndk-r17c/android-ndk-r17c
# ndk对应平台编译器所在目录
TOOLCHAIN=$NDK_ROOT/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64PREFIX=./android/ffmpeg./configure \
--prefix=$PREFIX \
--disable-x86asm \
--enable-small \
--disable-programs \
--disable-avdevice \
--enable-cross-compile \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--sysroot=$NDK_ROOT/platforms/android-23/arch-arm \
--extra-cflags="-isysroot $NDK_ROOT/sysroot -isystem $NDK_ROOT/sysroot/usr/include/arm-linux-androideabi -D__ANDROID_API__=23 -U_FILE_OFFSET_BITS -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -mthumb -Wa,--noexecstack -Wformat -Werror=format-security -O0 -fPIC" \
--arch=arm \
--target-os=android make clean
make -j20 install
以上命令的一些解释:
PREFIX:你编译好的库输出的目录
–PREFIX=./android/ffmpeg
指定输出路径
–enable-small
优化大小
–disable-programs
不编译ffmpeg程序(命令行工具)
----disable-avdevice
关闭avdevice模块 在安卓中无用
–disable-encoders
关闭所有编码器
–disable-filter
关闭所有滤镜
–enable-cross-compile
开启交叉编译
–cross-prefix
查找ndk的gcc(编译器)
–sysroot
寻找ndk所有的库文件
–disable-shared
关闭动态库输出
–extra-cflags
传给编译器的参数
–arch=arm
如果编译的是64位库则写成arm64
–target-os=android
目标系统
make clean
每次编译前都清理上一次运行产生的文件
make -j20 install
-j20的意思是并行20个线程,推荐写成你的cpu核心数
编译64位略有不同:
# NDK目录
NDK_ROOT=/mnt/c/Users/Administrator/ubuntu_dev/ndk/android-ndk-r17c/android-ndk-r17c
# ndk对应平台编译器所在目录
TOOLCHAIN=$NDK_ROOT/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64PREFIX=./android/ffmpeg64./configure \
--prefix=$PREFIX \
--disable-x86asm \
--enable-small \
--disable-programs \
--disable-avdevice \
--enable-cross-compile \
--cross-prefix=$TOOLCHAIN/bin/aarch64-linux-android- \
--sysroot=$NDK_ROOT/platforms/android-23/arch-arm64 \
--extra-cflags="-isysroot $NDK_ROOT/sysroot -isystem $NDK_ROOT/sysroot/usr/include/aarch64-linux-android -D__ANDROID_API__=23 -U_FILE_OFFSET_BITS -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -march=armv8-a -Wa,--noexecstack -Wformat -Werror=format-security -O0 -fPIC" \
--arch=aarch64 \
--target-os=android \
--enable-sharedmake clean
make -j20 install
执行命令
sudo sh xxx.sh
编译结果
很多时候会报错,一般报错之后都是编译失败了。可以停止编译,查看输出的信息去修改对应的命令。
如果控制台输出的信息判断不了是什么问题可以查看编译日志(以我这里为例):./ffbuild/config.log。
很多时候就是因为编译的命令路径问题或者版本问题导致的,有时候也因为linux发行版依赖的一些库缺失。
Clang编译
Clang编译与gcc编译基本一致,这里我们使用Ndk21.4和当下最新的FFmpeg6.1为例
编写sh脚本
与上面一致编写shell:
# NDK目录
NDK_ROOT=/mnt/c/Users/Administrator/ubuntu_dev/ndk/android-ndk-r21e
# ndk对应平台编译器所在目录
TOOLCHAIN=$NDK_ROOT/toolchains/llvm/prebuilt/linux-x86_64
# 需要编译出的平台,这里是 arm64-v8a
ARCH=aarch64# 支持的最低 Android API
API=23PREFIX=./android/ffmpeg64./configure \--target-os=android \--prefix=$PREFIX \--arch=$ARCH \--sysroot=$TOOLCHAIN/sysroot \--disable-static \--disable-ffmpeg \--disable-ffplay \--disable-ffprobe \--disable-debug \--disable-doc \--disable-avdevice \--enable-shared \--enable-cross-compile \--cross-prefix=$TOOLCHAIN/bin/aarch64-linux-android- \--cc=$TOOLCHAIN/bin/aarch64-linux-android$API-clang \--cxx=$TOOLCHAIN/bin/aarch64-linux-android$API-clang++ \--extra-cflags="-fpic"make clean all
make -j20 install
可见这里的脚本与上面差不多,只是编写更加规范,常修改的值都提取出来作为变量,方便日后修改编译
现成的FFmpeg库
这里提供作者自己编译好的FFmpeg供大家直接使用:
https://download.csdn.net/download/javy_codercoder/88661461
相关文章:
使用Ubuntu编译FFmpeg生成Android动态库/静态库
环境 我这里使用windows里的wsl2的ubuntu,使用物理机或者vmware,vbox之类的安装的ubuntu理论上也可以. gcc编译使用的环境如下: Ndk使用17 FFmpeg使用4.0.2. clang编译使用的环境如下: Ndk使用21.4 FFmpeg使用6.1 FFmpeg下载地址:https://ffmpeg.org/…...
【AIGC-图片生成视频系列-2】八仙过海,各显神通:AI生成视频相关汇总剖析
最近「图片生成视频系列」层出不穷,我拜读并结合实践(对,就是手撕代码,有开源就撕),并对以下几篇文章的相似点以及关键点稍微做个总结: 一. 生成视频中图像的一致性 在图像生成视频的这个过程…...
SpringBoot集成RabbitMq消息队列【附源码】
1. 项目背景 要啥项目背景,就是干!!! SpringBoot版本:2.7.12 2. Rabbit MQ安装 这里讲解使用docker安装RabbitMQ,如果在windows下面安装RabbitMQ,参考下文 【笑小枫的按步照搬系列】Window…...
MySQL数据库的安装与环境配置
下载 下载MySQL8 安装 解压 配置MySQL环境变量 系统环境变量path D:\ProgramFiles\mysql-8.0.20-winx64\bin 1.点击属性 2.点击高级系统设置 3.点击环境变量 4.在系统变量中找到path 注意这里不是用户变量 5.新建后输入解压的地址 MySQL初始化和启动 以管理员身份运行cmd…...
【广州华锐互动】VR科技科普展厅平台:快速、便捷地创建出属于自己的虚拟展馆
随着科技的不断进步,虚拟现实(VR)技术已经在许多领域取得了显著的成果。尤其是在展馆设计领域,VR科技科普展厅平台已经实现了许多令人瞩目的新突破。 VR科技科普展厅平台是广州华锐互动专门为企业和机构提供虚拟展馆设计和制作的在线平台。通过这个平台&…...
XML Extension Supplement
LEGAL ISSUES, COMPANY POLICIES AND STANDARDS Web Services A Web service is a software system designed to support interoperable machine-to-machine interaction over a network. URI和URL URI,全称是统一资源标识符(Uniform Resource Ident…...
手拉手Springboot获取yml配置文件信息
环境介绍 技术栈 springboot3 软件 版本 mysql 8 IDEA IntelliJ IDEA 2022.2.1 JDK 17 Spring Boot 3.1.7 配置文件说明:启动配置文件优先级:properties高于yml 配置文件application.yml yml是 JSON 的超集,简洁而强大…...
行人重识别(ReID)基础知识入门
这里写目录标题 1、ReID技术概述1.1 基本原理1.2 实现流程1.3 重识别存在的技术挑战 2、训练数据格式介绍 1、ReID技术概述 1.1 基本原理 ReID,全称Re-identification,目的是利用各种智能算法在图像数据库中找到与要搜索的目标相似的对象。ReID是图像检…...
【音视频 ffmpeg 学习】 跑示例程序 持续更新中
环境准备 在上一篇文章 把mux.c 拷贝到main.c 中 使用 attribute(unused) 消除警告 __attribute__(unused)/** Copyright (c) 2003 Fabrice Bellard** Permission is hereby granted, free of charge, to any person obtaining a copy* of this software and associated docu…...
前端axios与python库requests的区别
当涉及到发送HTTP请求时,Axios和Python中的requests库都是常用的工具。下面是它们的详细说明: Axios: Axios是一个基于Promise的HTTP客户端,主要用于浏览器和Node.js环境中发送HTTP请求。以下是Axios的一些特点和用法࿱…...
达梦数据库文档
1:达梦数据库(DM8)简介 达梦数据库管理系统是武汉达梦公司推出的具有完全自主知识产权的高性能数据库管理系统,简称DM。达梦数据库管理系统目前最新的版本是8.0版本,简称DM8。 DM8是达梦公司在总结DM系列产品研发与应用经验的基础上…...
CorelDRAW2024新功能有哪些?CorelDRAW2024最新版本更新怎么样?
CorelDRAW2024新功能有哪些?CorelDRAW2024最新版本更新怎么样?让我们带您详细了解! CorelDRAW Graphics Suite 是矢量制图行业的标杆软件,2024年全新版本为您带来多项新功能和优化改进。本次更新强调易用性,包括更强大…...
基于Mapify的在线艺术地图设计
地图是传递空间信息的有效载体,更加美观、生动的地图产品也是我们追求目标。 那么,我们如何才能制出如下图所示这样一幅艺术性较高的地图呢?今天我们来一探究竟吧! 按照惯例,现将网址给出: https://www.m…...
mxxWechatBot微信机器人V2版本文档说明
大家伙,我是雄雄,欢迎关注微信公众号:雄雄的小课堂。 先看这里 一、前言二、mxxWechatBot流程图三、怎么使用? 一、前言 经过不断地探索与研究,mxxWechatBot正式上线,届时全面开放使用。 mxxWechatBot&am…...
红队打靶练习:MISDIRECTION: 1
信息收集 1、arp ┌──(root㉿ru)-[~/kali] └─# arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:0c:29:69:c7:bf, IPv4: 192.168.12.128 Starting arp-scan 1.10.0 with 256 hosts (https://github.com/royhills/arp-scan) 192.168.12.1 00:50:56:c0:00:08 …...
Jmeter吞吐量控制器总结
吞吐量控制器(Throughput Controller) 场景: 在同一个线程组里, 有10个并发, 7个做A业务, 3个做B业务,要模拟这种场景,可以通过吞吐量模拟器来实现。 添加吞吐量控制器 用法1: Percent Executions 在一个线程组内分别建立两个吞吐量控制器, 分别放业务A和业务B …...
【XML】TinyXML 详解(二):接口详解
【C】郭老二博文之:C目录 1、XML测试文件(laoer.xml) <?xml version"1.0" standalone"no" ?> <!-- Hello World !--> <root><child name"childName" id"1"><c_child…...
【机器学习】人工智能概述
人工智能(Artificial Intelligence,简称AI)是一门研究如何使机器能够像人一样思考、学习和执行任务的学科。它是计算机科学的一个重要分支,涉及机器学习、自然语言处理、计算机视觉等多个领域。 人工智能的概念最早可以追溯到20世…...
flink 实时写入 hudi 参数推荐
数据湖任务并行度计算...
传统项目基于tomcat cookie单体会话升级分布式会话解决方案
传统捞项目基于servlet容器 cookie单体会话改造分布式会话方案 ##引入redis,spring-session依赖 <!--redis依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>&…...
未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...
iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...
树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频
使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...
JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...
蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...
dedecms 织梦自定义表单留言增加ajax验证码功能
增加ajax功能模块,用户不点击提交按钮,只要输入框失去焦点,就会提前提示验证码是否正确。 一,模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...
什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...
【算法训练营Day07】字符串part1
文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接:344. 反转字符串 双指针法,两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...
Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...
