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

编译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-r17cndk-18b中的toolchains/llvm/prebuilt/darwin-x86_64/bin中没有clang编译工具集,而是在上层目录中。

  • 只有armv7-a的执行文件中间有eabi结尾,其他没有。例:armv7a-linux-androideabi21-clangx86_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>&lt;</span>jni.h</span><span>&gt;</span></span>//这里要注意,因为这是个c++文件,必须把头文件引用放到extern "C"中
//不然一直报undefined的错误,坑了很久,以前我都是写c
extern "C" {
#include &lt;libavutil/avutil.h&gt;JNIEXPORT jstring JNICALL
Java_demo_simple_example_1ffmpeg_MainActivity_getVersion(JNIEnv *env, jclass clazz) {const char *version = av_version_info();return env-&gt;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_libraryset_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源代码&#xff0c;进入源码目录创建build_android.sh脚本&#xff0c;ffmpeg从4.0起新增了target-osandroid&#xff0c;所以不用再修改configure文件。 注意&#xff1a; ndk…...

yum的基本使用方法

yum&#xff08;全称 "Yellow dog Updater Modified"&#xff09;是基于RPM包管理器的软件包管理系统&#xff0c;主要用于Fedora和Red Hat系列的Linux发行版中。它允许用户安装、更新、删除以及搜索软件包&#xff0c;并能自动处理软件包之间的依赖关系。下面是一些…...

Nginx+Keepalive集群实战

随着Nginx在国内的发展潮流&#xff0c;越来越多的互联网公司都在使用Nginx&#xff0c;Nginx高性能、稳定性成为IT人士青睐的HTTP和反向代理服务器。 Nginx负载均衡一般位于整个网站架构的最前端或者中间层&#xff0c;如果为最前端时单台Nginx会存在单点故障&#xff0c;也就…...

[数据集][目标检测]街道乱放广告牌检测数据集VOC+YOLO格式114张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;114 标注数量(xml文件个数)&#xff1a;114 标注数量(txt文件个数)&#xff1a;114 标注类别…...

腾讯云的免费ssl证书过期后不占用免费额度

我申请了三张免费证书&#xff0c;两张过期了&#xff0c;已使用的数量还是1&#xff0c;说明已过期的不占免费额度&#xff0c;这样的话&#xff0c;只要每三个月重新申请就能一直用免费证书了。 下证很快&#xff0c;第一张一分钟以内&#xff0c;第二张大概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实现“单词反转”

问题&#xff1a; 随便输出一个字符串 String str "45abc,defg"; 里面含有 abc&#xff0c;de&#xff0c;fg 三个单词 怎么处理能让单词反转&#xff0c;其他顺序不变呢 输出 “45cba,edgf”; 解答思路&#xff1a; 以下是使用 Java 实现的单词反转程序&#xff1a…...

【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 数据库定义语言&#xff08;DDL…...

接口测试 —— 如何设计高效的测试用例!

摘要&#xff1a; 随着互联网应用的日益复杂化&#xff0c;接口测试已成为保证软件质量不可或缺的一部分。本文将探讨如何有效地设计接口测试用例&#xff0c;并提供实用的建议和示例。 一、引言 接口测试&#xff08;API测试&#xff09;是确保系统各部分之间交互正确性的关键…...

linux top命令介绍以及使用

文章目录 介绍 top 命令1. top 的基本功能2. 如何启动 top3. top 的输出解释系统概况任务和 CPU 使用情况内存和交换空间进程信息 4. 常用操作 总结查看逻辑CPU的个数查看系统运行时间 介绍 top 命令 top 是一个在类 Unix 系统中广泛使用的命令行工具&#xff0c;用于实时显示…...

必备资源!精选大模型领域100篇必读论文,赶紧加入收藏夹!

本文主要为当前大模型领域热门研究方向&#xff08;如文生图、文生视频、文生音乐等&#xff09;的热门论文。希望能够为大家提供较为全面的大模型最新研究进展。当然&#xff0c;目前还无法涵盖所有热门论文以及研究方向&#xff0c;望请见谅。 以下&#xff0c;为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题题目&#xff1a;农作物的种植策略 思路可以参考我主页之前的文章 以下均为python代码&#xff0c;推荐用anaconda中的notebook当作编译环境 from gurobipy import Model import pandas as pd import gurobipy as g…...

Java基础 - 14 - Java高级技术

一.单元测试 就是针对最小的功能单元&#xff08;方法&#xff09;&#xff0c;编写测试代码对其进行正确性测试 1.1 Junit单元测试框架 可以用来对方法进行测试&#xff0c;它是第三方公司开源出来的&#xff08;很多开发工具已经集成了Junit框架&#xff0c;如IDEA&#xff…...

glsl着色器学习(六)

准备工作已经做完&#xff0c;下面开始渲染 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智能监管方案如何重塑食品卫生安全防线

一、方案背景 近年来&#xff0c;食品安全问题频发&#xff0c;引发了社会各界的广泛关注。其中&#xff0c;毒枸杞事件尤为引人关注。新闻报道&#xff0c;在青海格尔木、甘肃靖远等地&#xff0c;部分商户为了提升枸杞的品相&#xff0c;违规使用焦亚硫酸钠和工业硫磺进行“…...

git进阶·团队开发的时候为何要创建临时分支来修复bug

若在团队开发中&#xff0c;突然遇到一个功能性bug&#xff0c;你会怎么使用git来管理分支呢&#xff1f; 在近些年来&#xff0c;团队工作的经验中&#xff0c;我总结出来的是&#xff0c;最好是先创建一个临时分支来修复bug&#xff0c;修复好后&#xff0c;再合并到主分支或…...

Unity 性能优化工具收集

本文地址&#xff1a;https://blog.csdn.net/t163361/article/details/141809415 Unity原始工具 UPR 官方 UPR UPR桌面端解决方案&#xff0c;减轻测试设备性能压力&#xff0c;使测试过程更加顺畅。提供CLI用于自动化测试系统对接。 PerformanceBenchmarkReporter Unity 性…...

linux下的Socket网络编程教程

套接字概念 Socket本身有“插座”的意思&#xff0c;在Linux环境下&#xff0c;用于表示进程间网络通信的特殊文件类型。本质为内核借助缓冲区形成的伪文件。与管道类似的&#xff0c;Linux系统将其封装成文件的目的是为了统一接口&#xff0c;使得读写套接字和读写文件的操作…...

华为人工智能重要服务总结

一&#xff0c;视觉智能服务 一&#xff0c;图像识别服务 1.媒资图像标签服务 媒资素材管理&#xff0c;内容推荐广告营销等 2.图像描述服务 融合计算机视觉&#xff0c;自然语言处理和多模态技术&#xff0c;对输入图像进行画面内容描述 3.主体识别服务 像主体识别能检测出…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误&#xff0c;它们的含义、原因和解决方法都有显著区别。以下是详细对比&#xff1a; 1. HTTP 406 (Not Acceptable) 含义&#xff1a; 客户端请求的内容类型与服务器支持的内容类型不匹…...

2024年赣州旅游投资集团社会招聘笔试真

2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...

React Native在HarmonyOS 5.0阅读类应用开发中的实践

一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强&#xff0c;React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 &#xff08;1&#xff09;使用React Native…...

大模型多显卡多服务器并行计算方法与实践指南

一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建

华为云FlexusDeepSeek征文&#xff5c;DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色&#xff0c;华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型&#xff0c;能助力我们轻松驾驭 DeepSeek-V3/R1&#xff0c;本文中将分享如何…...

React---day11

14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store&#xff1a; 我们在使用异步的时候理应是要使用中间件的&#xff0c;但是configureStore 已经自动集成了 redux-thunk&#xff0c;注意action里面要返回函数 import { configureS…...

JVM虚拟机:内存结构、垃圾回收、性能优化

1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲

文章目录 前言第一部分&#xff1a;体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分&#xff1a;体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...

libfmt: 现代C++的格式化工具库介绍与酷炫功能

libfmt: 现代C的格式化工具库介绍与酷炫功能 libfmt 是一个开源的C格式化库&#xff0c;提供了高效、安全的文本格式化功能&#xff0c;是C20中引入的std::format的基础实现。它比传统的printf和iostream更安全、更灵活、性能更好。 基本介绍 主要特点 类型安全&#xff1a…...

vue3 daterange正则踩坑

<el-form-item label"空置时间" prop"vacantTime"> <el-date-picker v-model"form.vacantTime" type"daterange" start-placeholder"开始日期" end-placeholder"结束日期" clearable :editable"fal…...