在 Windows 系统下,将 FFmpeg 编译为 .so 文件

1. 准备环境

确保你的 Windows 系统已安装以下工具:

  • Android Studio

  • NDK(Native Development Kit)

  • MSYS2(用于提供类 Unix 环境)

  • FFmpeg 源码

  • Git Bash(可选,推荐使用)

安装 MSYS2
  1. 下载并安装 MSYS2。

  2. 打开 MSYS2 终端,更新包管理器:

pacman -Syu

      3.安装必要的工具:

pacman -S make pkg-config diffutils git

2. 下载 FFmpeg 源码

在 MSYS2 终端中,克隆 FFmpeg 源码:

git clone https://github.com/FFmpeg/FFmpeg.git
cd FFmpeg

3. 配置 FFmpeg 编译脚本

在 FFmpeg 源码目录中创建一个 build_android.sh 脚本,内容如下:

#!/bin/bash# 设置 NDK 路径
NDK=/d/aaa/ndk/21.4.7075529
# 设置输出目录
OUTPUT=/d/output# 定义架构和 API 组合
ARCHS=("arm" "arm64")
CPUS=("armv7-a" "armv8-a")
APIS=(21 21)# 遍历架构
for i in "${!ARCHS[@]}"; doARCH=${ARCHS[$i]}CPU=${CPUS[$i]}API=${APIS[$i]}# 设置工具链TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/windows-x86_64SYSROOT=$TOOLCHAIN/sysroot# 设置编译器和编译选项if [ "$ARCH" == "arm" ]; thenCC=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clangCROSS_PREFIX=$TOOLCHAIN/bin/arm-linux-androideabi-elseCC=$TOOLCHAIN/bin/aarch64-linux-android$API-clangCROSS_PREFIX=$TOOLCHAIN/bin/aarch64-linux-android-fiCFLAGS="-march=$CPU -Os -fPIC -D__ANDROID_API__=$API"LDFLAGS=""# 配置 FFmpeg./configure \--prefix=$OUTPUT/$ARCH \--enable-shared \--disable-static \--disable-doc \--disable-ffmpeg \--disable-ffplay \--disable-ffprobe \--disable-symver \--disable-asm \--enable-cross-compile \--cross-prefix=$CROSS_PREFIX \--target-os=android \--arch=$ARCH \--sysroot=$SYSROOT \--cc=$CC \--extra-cflags="$CFLAGS" \--extra-ldflags="$LDFLAGS"# 编译并安装make cleanmake -j4make install
done

确保你的 NDK 已经解压或安装到 D:\aaa 目录下。例如,NDK 的完整路径可能是:

D:\aaa\ndk\25.1.8937393

在 FFmpeg 编译脚本中,将 NDK 路径设置为 D:\aaa 目录。由于 Windows 路径使用反斜杠 \,而在类 Unix 环境(如 MSYS2)中需要使用正斜杠 /,因此需要将路径转换为类 Unix 格式。

4. 运行编译脚本

  1. 在 MSYS2 终端中,进入 FFmpeg 源码目录。

  2. 运行编译脚本:

chmod +x build_android.sh
./build_android.sh

编译完成后,.so 文件会生成在 OUTPUT 指定的目录中。

5.检查编译器版本

运行以下命令检查 gcc 或 clang 的版本:

gcc --version

clang --version

6. 升级 GCC 或 Clang

pacman -Syu
pacman -S mingw-w64-x86_64-gcc

如果报错,检查

7. 检查是否安装了 GCC

运行以下命令检查 GCC 是否已安装:

which gcc

pacman -Q mingw-w64-x86_64-gcc

确认 GCC 的安装路径

GCC 的可执行文件通常安装在 MSYS2 的 mingw64/bin 目录下。运行以下命令,检查 GCC 是否存在:

ls /mingw64/bin/gcc.exe

8.配置环境变量(如果需要)

如果 gcc --version 仍然报错,可能是因为 GCC 的路径没有添加到系统的环境变量中。

  • 确保 MSYS2 的 mingw64/bin 或 usr/bin 目录在环境变量中。

  • 打开 MSYS2 终端,运行以下命令检查路径:

echo $PATH

如果路径中没有 mingw64/bin 或 usr/bin,手动添加:

export PATH=/mingw64/bin:$PATH

临时添加(仅当前终端会话有效)

运行以下命令:

export PATH=/mingw64/bin:$PATH

永久添加(对所有终端会话有效)

编辑你的 shell 配置文件(如 ~/.bashrc 或 ~/.bash_profile),添加以下行:

export PATH=/mingw64/bin:$PATH

然后运行以下命令使配置生效:

source ~/.bashrc

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/73314.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

leetcode二叉树3

404.左叶子之和 给定二叉树的根节点 root ,返回所有左叶子之和。 示例 1: 输入: root [3,9,20,null,null,15,7] 输出: 24 解释: 在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24示例 2: 输入: root [1] 输…

QT网络通信的接口与使用

文章目录 前言1.服务端实现流程1.1步骤 1:创建 QTcpServer 并监听端口1.2步骤 2:处理新连接请求1.3步骤 3:接收客户端数据1.4步骤 4:处理客户端断开 2.客户端实现流程2.1步骤 1:创建 QTcpSocket 并连接服务器2.2步骤 2…

华为OD机试2025A卷七日集训第1期 - 按算法分类,由易到难,循序渐进,玩转OD(Python/JS/C/C++)

目录 一、适合人群二、本期训练时间三、如何参加四、7日集训第1期五、精心挑选21道高频100分经典题目,作为入门。第1天、逻辑分析第2天、逻辑分析第3天、逻辑分析第4天、逻辑分析第5天、双指针第6天、二叉树第7天、回溯 六、集训总结六、国内直接使用最新GPT-4.5、满…

Qt 重入和线程安全

重入和线程安全 在整个文档中,"重入"和 "线程安全 "这两个术语被用来标记类和函数,以表明它们在多线程应用程序中的使用方式: 线程安全函数可以同时被多个线程调用,即使调用使用的是共享数据,因…

Elasticsearch:构建 AI 驱动的搜索体验

Elasticsearch 介绍 当你开始使用 Elastic 时,你将使用 Elasticsearch Relevance Engine™(ESRE),它专为 AI 搜索应用程序提供支持。借助 ESRE,你可以利用一整套开发者工具,包括 Elastic 的文本搜索、向量…

鸿蒙生态开发

鸿蒙生态开发概述 鸿蒙生态是华为基于开源鸿蒙(OpenHarmony)构建的分布式操作系统生态,旨在通过开放共享的模式连接智能终端设备、操作系统和应用服务,覆盖消费电子、工业物联网、智能家居等多个领域。以下从定义与架构、核心技术…

JVM如何处理Java中的精度转换: 从源码到字节码

你好,我是 shengjk1,多年大厂经验,努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注!你会有如下收益: 了解大厂经验拥有和大厂相匹配的技术等 希望看什么,评论或者私信告诉我! 文章目录 一…

vue-next-admin修改配置指南

官方文档地址:vue-next-admin 1.如何开启侧边栏logo 在scr-layout-navbars-topBar-setings.vue中添加 getThemeConfig.value.isShowLogo true; 设置为true即可默认打开 2.修改侧边栏顶部的logo与文字 先把想要的图标存到我的项目然后下载 然后把后面的几个文件拉…

gin学习

gin学习笔记,不仅包含了基本的增删查改外,还包括参数传递,上传下载,模版、session与中间件等,方便收藏自习可用 文章目录 获得个请求get打印字符串get请求xmlget请求跳转http方法路由可以通过Context的Param方法来获取…

Flutter运行错误:UG! exception in phase ‘semantic analysis‘

最近在Mac Mini M4上通过Android Studio导入Flutter项目并运行,结果一直跑不起来,错误日志如下: 执行命令查看版本信息: flutter doctor --verbose通过输出信息Java version OpenJDK Runtime Environment (build 21.0.41242208…

【计算机网络运输层详解】

文章目录 一、前言二、运输层的功能1. 端到端通信2. 复用与分用3. 差错检测4. 流量控制5. 拥塞控制 三、运输层协议:TCP 和 UDP1. TCP:面向连接的可靠传输协议2. UDP:无连接的传输协议 四、端口号与进程通信1. 端口号分类2. 端口通信模型 五、…

51单片机和STM32 入门分析

51单片机和STM32是嵌入式开发中两种主流的微控制器,它们在架构、性能、应用场景等方面存在显著差异。以下是两者的对比分析及选择建议: 1. 51单片机与STM32的定义与特点 51单片机 定义:基于Intel 8051内核的8位微控制器,结构简单…

开源视觉语言模型MiniMax-VL-01:动态分辨率+4M超长文本,性能比肩GPT-4o

在人工智能领域,构建能够像人类一样理解、思考和行动的智能体(AI Agent)一直是研究人员的终极目标之一。而实现这一目标的关键在于模型是否具备足够强大的感知能力、记忆能力和推理能力。近期,国内人工智能公司MiniMax重磅开源了其…

excel 列单元格合并(合并列相同行)

代码 首先自定义注解CellMerge,用于标记哪些属性需要合并,哪个是主键**(这里做了一个优化,可以标记多个主键)** import org.dromara.common.excel.core.CellMergeStrategy;import java.lang.annotation.*;/*** excel…

flowable适配达梦7 (2.1)

经过第一版的问题解决,后端项目可以启动,前端页面也集成进去。 前端在流程设计页面报错 之后发现主要是组件中modelerStore这个值没有 解决方法:在data增加对象 给component/process/designer.vue 中涉及到的每个子组件传入 :modelerStore“modeler…

Prometheus Exporter系列-Mysql_Exporter一键部署

新项目旧项目都需要给研发配置mysql监控,这里mysql监控对应aws 阿里云 腾讯云 华为云的云mysql产品或开源自建mysql。 exporter安装虽然简单,经常手动操作不免让人心烦,一键完成省去繁琐的常规操作。 配置信息对的情况下测试多次都可以正常安…

2025年移动端开发性能优化实践与趋势分析

启动速度优化 本质:缩短首次可见帧渲染时间。 方法: iOS:利用Core ML本地模型轻量化部署,减少云端等待。Android:强制启用SplashScreen API,通过setKeepOnScreenCondition控制动画时长。冷启动需将耗时操…

【MySQL篇】DEPENDENT SUBQUERY(依赖性子查询)优化:从百秒到秒级响应的四种优化办法

💫《博主介绍》:✨又是一天没白过,我是奈斯,从事IT领域✨ 💫《擅长领域》:✌️擅长阿里云AnalyticDB for MySQL(分布式数据仓库)、Oracle、MySQL、Linux、prometheus监控;并对SQLserver、NoSQL(…

全文 - MLIR Toy Tutorial Chapter 1: Toy Language and AST

Toy 语言 本教程,将会借助一个玩具语言来讲解,这个语言我们称其为 Toy。Toy 是一个基于张量的语言,它允许你定义函数,执行一些数学计算,并且打印结果。做这样的设定,是因为我们希望让教程保持简明&#xff…

排序复习_代码纯享

头文件 #pragma once #include<iostream> #include<vector> #include<utility> using std::vector; using std::cout; using std::cin; using std::endl; using std::swap;//插入排序 //1、直接插入排序&#xff08;稳定&#xff09; void InsertSort(vecto…