编译FFmpeg动态库
编译FFmpeg动态库
环境
- macOS High Sierra
- FFmpeg 4.3
- android-ndk-r21b
编译so库
下载FFmpeg4.3源代码,进入源码目录创建build_android.sh脚本,ffmpeg从4.0起新增了target-os=android,所以不用再修改configure文件。
注意:
-
ndk-17以前内置的编译器是gcc,而新版的ndk已经用clang替代了gcc编译器,所以使用-cc和-cxx指令时要特别注意自己要使用的编译器是gcc还是clang。 -
还有个我遇到的问题就是在
ndk-r17c和ndk-18b中的toolchains/llvm/prebuilt/darwin-x86_64/bin中没有clang编译工具集,而是在上层目录中。 -
只有
armv7-a的执行文件中间有eabi结尾,其他没有。例:armv7a-linux-androideabi21-clang,x86_64-linux-android21-clang。如果报错not found xxx file的错误,就自行到相应目录查看。
#!/bin/bash# ndk路径
NDK=/Users/chenpeng/Desktop/work_space/ndk/android-ndk-r21b
# 编译工具链目录,ndk17版本以上用的是clang,以下是gcc
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/darwin-x86_64
# 版本号
API=21
# 交叉编译树的根目录(查找相应头文件和库用)
SYSROOT="${TOOLCHAIN}/sysroot"# armv7-a
OUTPUT_FOLDER="armeabi-v7a"
ARCH="arm"
CPU="armv7-a"
TOOL_CPU_NAME=armv7a
TOOL_PREFIX="$TOOLCHAIN/bin/${TOOL_CPU_NAME}-linux-androideabi"
OPTIMIZE_CFLAGS="-march=$CPU"# arm64-v8a,这个指令集最低支持api21
# OUTPUT_FOLDER="arm64-v8a"
# ARCH="aarch64"
# CPU="armv8-a"
# TOOL_CPU_NAME=aarch64
# TOOL_PREFIX="$TOOLCHAIN/bin/${TOOL_CPU_NAME}-linux-android"
# OPTIMIZE_CFLAGS="-march=$CPU"# x86
# OUTPUT_FOLDER="x86"
# ARCH="x86"
# CPU="x86"
# TOOL_CPU_NAME="i686"
# TOOL_PREFIX="$TOOLCHAIN/bin/${TOOL_CPU_NAME}-linux-android"
# OPTIMIZE_CFLAGS="-march=i686 -mtune=intel -mssse3 -mfpmath=sse -m32"# x86_64,这个指令集最低支持api21
# OUTPUT_FOLDER="x86_64"
# ARCH="x86_64"
# CPU="x86_64"
# TOOL_CPU_NAME="x86_64"
# TOOL_PREFIX="$TOOLCHAIN/bin/${TOOL_CPU_NAME}-linux-android"
# OPTIMIZE_CFLAGS="-march=$CPU"# 输出目录
PREFIX="${PWD}/android/$OUTPUT_FOLDER"
# so的输出目录, --libdir=$LIB_DIR 可以不用指定,默认会生成在$PREFIX/lib目录中
#LIB_DIR="${PWD}/android/libs/$OUTPUT_FOLDER"
# 编译器
CC="${TOOL_PREFIX}${API}-clang"
CXX="${TOOL_PREFIX}${API}-clang++"# 定义执行configure的shell方法
function build_android() {./configure \--prefix=$PREFIX \--enable-shared \--disable-static \--enable-jni \--disable-doc \--disable-programs \--disable-symver \--target-os=android \--arch=$ARCH \--cpu=$CPU \--cc=$CC \--cxx=$CXX \--enable-cross-compile \--sysroot=$SYSROOT \--extra-cflags="-Os -fpic $OPTIMIZE_CFLAGS" \--extra-ldflags="" \--disable-asm \$COMMON_FF_CFG_FLAGSmake cleanmake -j8make install
}
build_android
更多构建参数可以使用./configure -h参看
shell脚本语言不熟的可以查看我的shell学习笔记
执行build_android.sh脚本,等待脚本执行完成,执行过程可能会遇到缺少组件的问题,按需解决。
# 如遇到permission denied,请chmod 777 xx.sh
sh build_android.sh
生成文件目录如下:

创建一个新的Android Cmake项目
将动态库放入libs/armeabi-v7a文件夹,将头文件方法cpp目录

新增ffmpeg_utils.cpp类,配置build.gradle,配置CMakeLists.txt
#include <span><span><span><</span>jni.h</span><span>></span></span>//这里要注意,因为这是个c++文件,必须把头文件引用放到extern "C"中
//不然一直报undefined的错误,坑了很久,以前我都是写c
extern "C" {
#include <libavutil/avutil.h>JNIEXPORT jstring JNICALL
Java_demo_simple_example_1ffmpeg_MainActivity_getVersion(JNIEnv *env, jclass clazz) {const char *version = av_version_info();return env->NewStringUTF(version);
}}
android {compileSdkVersion 29buildToolsVersion "30.0.0"defaultConfig {applicationId "demo.simple.example_ffmpeg"minSdkVersion 21targetSdkVersion 29versionCode 1versionName "1.0"testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"//ndk so架构的选择externalNativeBuild {ndk {abiFilters 'armeabi-v7a'}}//so查找路径sourceSets {main {jniLibs.srcDirs = ['libs']}}}//cmake文件的查找路径externalNativeBuild {cmake {path file('CMakeLists.txt')}}
}
# 设置构建本机库文件所需的 CMake的最小版本
cmake_minimum_required(VERSION 3.4.1)#添加头文件的搜索路径
include_directories(src/main/cpp/include/)# 添加自己写的 C/C++源文件
add_library(utils #so名称SHARED #动态库src/main/cpp/ffmpeg_utils.cpp)# 添加外部的库(可以是动态库或静态库),这里只引入了avutil
set(LIBS_DIR ${CMAKE_SOURCE_DIR}/libs/${ANDROID_ABI})
add_library(avutilSHAREDIMPORTED)
set_target_properties(avutilPROPERTIES IMPORTED_LOCATION${LIBS_DIR}/libavutil.so)# 依赖 NDK中自带的log库
find_library(log-lib log)# 链接库
target_link_libraries(utilsavutil${log-lib})
加载动态库,获取FFmpeg的版本号
public class MainActivity extends AppCompatActivity {private static final String TAG = "MainActivity";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);TextView tvVersion = findViewById(R.id.tvVersion);String version = String.format("ffmpeg version == %s", getVersion());tvVersion.setText(version);Log.d(TAG, version);}static {System.loadLibrary("utils");System.loadLibrary("avutil");}public static native String getVersion();
}
输出结果:
ffmpeg version == 4.3
简写导入动态库的cmake语句
上面CmakeList引入avutil使用了add_library和set_target_properties,如果同时引用很多动态库,那就要写很多的重复配置,我们完全可以使用下面的方式简写配置。或者也可以将所有动态库合并成一个动态库。
# 去掉`add_library`和`set_target_properties`的相关配置#设置查找动态库位置
set(LINK_DIR ${CMAKE_SOURCE_DIR}/libs/${CMAKE_ANDROID_ARCH_ABI})
link_directories(${LINK_DIR})
#找到所有的so库,存放在全局变量SO_DIR中
file(GLOB SO_DIR ${LINK_DIR}/*.so)# 链接库
target_link_libraries(utils${SO_DIR}${log-lib})
源码地址
example_ffmpeg
相关文章:
编译FFmpeg动态库
编译FFmpeg动态库 环境 macOS High SierraFFmpeg 4.3android-ndk-r21b 编译so库 下载FFmpeg4.3源代码,进入源码目录创建build_android.sh脚本,ffmpeg从4.0起新增了target-osandroid,所以不用再修改configure文件。 注意: ndk…...
yum的基本使用方法
yum(全称 "Yellow dog Updater Modified")是基于RPM包管理器的软件包管理系统,主要用于Fedora和Red Hat系列的Linux发行版中。它允许用户安装、更新、删除以及搜索软件包,并能自动处理软件包之间的依赖关系。下面是一些…...
Nginx+Keepalive集群实战
随着Nginx在国内的发展潮流,越来越多的互联网公司都在使用Nginx,Nginx高性能、稳定性成为IT人士青睐的HTTP和反向代理服务器。 Nginx负载均衡一般位于整个网站架构的最前端或者中间层,如果为最前端时单台Nginx会存在单点故障,也就…...
[数据集][目标检测]街道乱放广告牌检测数据集VOC+YOLO格式114张1类别
数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):114 标注数量(xml文件个数):114 标注数量(txt文件个数):114 标注类别…...
腾讯云的免费ssl证书过期后不占用免费额度
我申请了三张免费证书,两张过期了,已使用的数量还是1,说明已过期的不占免费额度,这样的话,只要每三个月重新申请就能一直用免费证书了。 下证很快,第一张一分钟以内,第二张大概5分钟左右。 原来…...
MySQL学习(DDL,DML,DQL)基本语法总结
DDL 使用某个数据库 use world;展示表 show tables;创建表 create table student(id int,name varchar(10),age int,gender varchar(10));删除表 drop table student; 修改表结构 查看表结构 desc student;添加列 alter table student add dept varchar(10);修改列名和类型…...
JAVA学习-练习试用Java实现“单词反转”
问题: 随便输出一个字符串 String str "45abc,defg"; 里面含有 abc,de,fg 三个单词 怎么处理能让单词反转,其他顺序不变呢 输出 “45cba,edgf”; 解答思路: 以下是使用 Java 实现的单词反转程序:…...
【MySQL】深圳大学数据库实验一
目录 一、实验目的 二、实验要求 三、实验设备 四、建议的实验步骤 4.1 使用SQL语句创建如上两张关系表 4.2 EXERCISES. 1 SIMPLE COMMANDS 4.3 EXERCISES 2 JOINS 4.4 EXERCISES 3 FUNCTIONS 4.5 EXERCISES 4 DATES 五、实验总结 5.1 数据库定义语言(DDL…...
接口测试 —— 如何设计高效的测试用例!
摘要: 随着互联网应用的日益复杂化,接口测试已成为保证软件质量不可或缺的一部分。本文将探讨如何有效地设计接口测试用例,并提供实用的建议和示例。 一、引言 接口测试(API测试)是确保系统各部分之间交互正确性的关键…...
linux top命令介绍以及使用
文章目录 介绍 top 命令1. top 的基本功能2. 如何启动 top3. top 的输出解释系统概况任务和 CPU 使用情况内存和交换空间进程信息 4. 常用操作 总结查看逻辑CPU的个数查看系统运行时间 介绍 top 命令 top 是一个在类 Unix 系统中广泛使用的命令行工具,用于实时显示…...
必备资源!精选大模型领域100篇必读论文,赶紧加入收藏夹!
本文主要为当前大模型领域热门研究方向(如文生图、文生视频、文生音乐等)的热门论文。希望能够为大家提供较为全面的大模型最新研究进展。当然,目前还无法涵盖所有热门论文以及研究方向,望请见谅。 以下,为2024年2月份…...
基于STM32设计的防盗书包(华为云IOT)(216)
文章目录 一、前言1.1 项目介绍【1】开发背景【2】项目实现的功能【3】项目硬件模块组成1.2 设计思路【1】整体设计思路【2】整体构架【3】上位机开发思路1.3 项目开发背景【1】选题的意义【2】可行性分析【3】参考文献【4】摘要【5】项目背景1.4 开发工具的选择【1】设备端开发…...
2024高教社杯全国大学生数学建模竞赛C题原创python代码
2024高教社杯全国大学生数学建模竞赛C题原创python代码 C题题目:农作物的种植策略 思路可以参考我主页之前的文章 以下均为python代码,推荐用anaconda中的notebook当作编译环境 from gurobipy import Model import pandas as pd import gurobipy as g…...
Java基础 - 14 - Java高级技术
一.单元测试 就是针对最小的功能单元(方法),编写测试代码对其进行正确性测试 1.1 Junit单元测试框架 可以用来对方法进行测试,它是第三方公司开源出来的(很多开发工具已经集成了Junit框架,如IDEAÿ…...
glsl着色器学习(六)
准备工作已经做完,下面开始渲染 gl.viewport(0, 0, gl.canvas.width, gl.canvas.height);gl.clearColor(0.5, 0.7, 1.0, 1.0); gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);gl.enable(gl.DEPTH_TEST); gl.enable(gl.CULL_FACE);设置视口 gl.viewport(0,…...
毒枸杞事件启示录:EasyCVR视频AI智能监管方案如何重塑食品卫生安全防线
一、方案背景 近年来,食品安全问题频发,引发了社会各界的广泛关注。其中,毒枸杞事件尤为引人关注。新闻报道,在青海格尔木、甘肃靖远等地,部分商户为了提升枸杞的品相,违规使用焦亚硫酸钠和工业硫磺进行“…...
git进阶·团队开发的时候为何要创建临时分支来修复bug
若在团队开发中,突然遇到一个功能性bug,你会怎么使用git来管理分支呢? 在近些年来,团队工作的经验中,我总结出来的是,最好是先创建一个临时分支来修复bug,修复好后,再合并到主分支或…...
Unity 性能优化工具收集
本文地址:https://blog.csdn.net/t163361/article/details/141809415 Unity原始工具 UPR 官方 UPR UPR桌面端解决方案,减轻测试设备性能压力,使测试过程更加顺畅。提供CLI用于自动化测试系统对接。 PerformanceBenchmarkReporter Unity 性…...
linux下的Socket网络编程教程
套接字概念 Socket本身有“插座”的意思,在Linux环境下,用于表示进程间网络通信的特殊文件类型。本质为内核借助缓冲区形成的伪文件。与管道类似的,Linux系统将其封装成文件的目的是为了统一接口,使得读写套接字和读写文件的操作…...
华为人工智能重要服务总结
一,视觉智能服务 一,图像识别服务 1.媒资图像标签服务 媒资素材管理,内容推荐广告营销等 2.图像描述服务 融合计算机视觉,自然语言处理和多模态技术,对输入图像进行画面内容描述 3.主体识别服务 像主体识别能检测出…...
Pretext:值得关注的文本排版引擎陨
一、语言特性:Java 26 与模式匹配进化 1.1 Java 26 语言级别支持 IDEA 2026.1 EAP 最引人注目的变化之一,就是新增 Java 26 语言级别支持。这意味着开发者可以提前体验和测试即将在 JDK 26 中正式发布的语言特性。 其中最重要的变化是对 JEP 530 的全面支…...
Stimulsoft 报告和仪表盘2026.2即将推出,来看具体详情
Stimulsoft Reports & Dashboards 2026.2 版本即将发布。本次更新将围绕报表查看器、数据源能力、参数验证以及仪表盘设计等多个方向展开,进一步增强产品在报表开发与可视化分析场景中的灵活性与智能化水平。 从 React 报表查看器,到由人工智能驱动…...
UEFI固件分析工具:深度解析与定制指南
UEFI固件分析工具:深度解析与定制指南 【免费下载链接】UEFITOOL28 项目地址: https://gitcode.com/gh_mirrors/ue/UEFITOOL28 UEFI固件(统一可扩展固件接口,用于初始化硬件的底层软件)分析是系统安全与硬件定制的关键环节…...
FastAPI异步测试终极指南:从配置到实现的完整教程
FastAPI异步测试终极指南:从配置到实现的完整教程 【免费下载链接】fastapi FastAPI framework, high performance, easy to learn, fast to code, ready for production 项目地址: https://gitcode.com/GitHub_Trending/fa/fastapi FastAPI异步测试是构建高…...
【EI复现】考虑网络动态重构的分布式电源选址定容优化方法(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
高斯数据库(GaussDB)SQL 常用语句总结
高斯数据库(GaussDB)SQL 常用语句总结 高斯数据库(GaussDB)是华为基于 PostgreSQL 开源生态开发的企业级分布式关系型数据库,兼容标准 SQL 92/99/2003,同时支持 PostgreSQL 语法,还自带分布式、高可用特性。 下面按日常开发高频场景整理最实用的 SQL 语句,直接复制就…...
自然语言处理实战指南:从文本表示到深度学习
自然语言处理实战指南:从文本表示到深度学习 标签:#自然语言处理、#人工智能、#大模型、#大模型实战、#transformer、#机器学习、#深度学习 模块四:项目实战 技术对比 避坑经验 4.1 项目实战(中文商品评论情感分析) …...
Phi-4-mini-reasoning模型效果展示:智能解读操作系统核心概念
Phi-4-mini-reasoning模型效果展示:智能解读操作系统核心概念 1. 模型能力概览 Phi-4-mini-reasoning是一款专注于技术概念解析的轻量级模型,特别擅长用通俗易懂的方式拆解复杂系统原理。在操作系统这类抽象概念的解释上,它能将教科书式的定…...
快速上手Qwen3-ASR-0.6B:无需代码基础,Gradio界面点点鼠标就能用
快速上手Qwen3-ASR-0.6B:无需代码基础,Gradio界面点点鼠标就能用 1. 零门槛语音识别体验 语音识别技术正在改变我们与设备交互的方式,但对于非技术人员来说,部署和使用专业模型往往存在门槛。Qwen3-ASR-0.6B通过预置的Gradio界面…...
Wux Weapp 终极国际化方案:打造多语言小程序完整指南
Wux Weapp 终极国际化方案:打造多语言小程序完整指南 【免费下载链接】wux-weapp :dog: 一套组件化、可复用、易扩展的微信小程序 UI 组件库 项目地址: https://gitcode.com/gh_mirrors/wu/wux-weapp 想要让你的微信小程序走向全球市场吗?Wux Wea…...
