本地电脑交叉编译ffmpeg 到 windows on arm64
本地电脑交叉编译ffmpeg 到 windows on arm64
我这里有编译好的win on arm 的 ffmpeg : https://github.com/wmx-github/ffmpeg-wos-arm64-build
使用 llvm-mingw 工具链 https://github.com/mstorsjo/llvm-mingw/releases
前缀 aarch64-w64-mingw32-
这个库是ubuntu 交叉编译的
在windows on arm 上开发使用,必须用llvm-mingw 工具链
参考ffmpeg官方文档:
https://trac.ffmpeg.org/wiki/CompilationGuide/CrossCompilingForWindows
参考:
https://github.com/BtbN/FFmpeg-Builds/issues/95
参考:
https://github.com/dvhh/ffmpeg-wos-arm64-build
docker镜像: llvm-mingw
https://hub.docker.com/r/mstorsjo/llvm-mingw/
1 拉取镜像运行容器
docker run -it mstorsjo/llvm-mingw:latest
镜像选择:特别注意:
-
如果使用
mstorsjo/llvm-mingw:20230614
使用的编译工具是LLVM 16.0.6
x264 执行 configure 传入参数--extra-cflags="-mfpu=neon" -
如果使用
mstorsjo/llvm-mingw:latest目前2024年8月20 就是llvm-mingw 20240820
使用的编译工具是LLVM 19.1.0
x264 执行 configure 传入参数--extra-cflags="-march=armv8"
2 构建脚本
root@0677f504e2da:/build# vi toolchain-llvm-mingw.cmake
toolchain-llvm-mingw.cmake 填入 :
set(CMAKE_SYSTEM_NAME Windows)
set(CMAKE_SYSTEM_PROCESSOR aarch64)set(CMAKE_C_COMPILER "aarch64-w64-mingw32-gcc")
set(CMAKE_CXX_COMPILER "aarch64-w64-mingw32-g++")
然后 Esc ,输入 :wq 回车保存
3 编译SDL
root@0677f504e2da:/build# git clone https://github.com/libsdl-org/SDL.git
root@0677f504e2da:/build/ cd SDL
root@0677f504e2da:/build/SDL#
cmake -S . -B build \
-DCMAKE_TOOLCHAIN_FILE=/build/toolchain-llvm-mingw.cmake \
-DCMAKE_INSTALL_PREFIX=/build/install
root@0677f504e2da:/build/SDL# cmake --build build
root@0677f504e2da:/build/SDL# cmake --install build
查看格式:
root@0677f504e2da:/build/SDL# file /build/install/bin/SDL2.dll
/build/install/bin/SDL2.dll: PE32+ executable (DLL) (GUI) Aarch64, for MS Windows
配置SDL 相关路径,使得pkgconfig能找到SDL
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/build/install/lib/pkgconfig
配置sdl2-config
ln -s /build/install/bin/sdl2-config /usr/local/bin/aarch64-w64-mingw32-sdl2-config
chmod +x /build/install/bin/sdl2-config /usr/local/bin/aarch64-w64-mingw32-sdl2-config
export PATH=$PATH:/usr/local/bin
4 编译x264
root@0677f504e2da:/build# git clone --depth=1 https://code.videolan.org/videolan/x264.git x264
root@0677f504e2da:/build# cd x264
root@0677f504e2da:/build/x264#
配置
./configure \
--host=aarch64-w64-mingw32 \
--cross-prefix=aarch64-w64-mingw32- \
--prefix=/build/install \
--enable-pic \
--extra-cflags="-march=armv8" \
--enable-shared \
--enable-static
编译安装
root@0677f504e2da:/build/x264#``make -j12 && make install
5 编译FFmpeg
root@0677f504e2da:/build# git clone https://github.com/FFmpeg/FFmpeg.git
root@0677f504e2da:/build# cd FFmpeg/
root@0677f504e2da:/build/FFmpeg#
./configure --pkg-config=/usr/bin/pkg-config \--pkgconfigdir=/build/install/lib/pkgconfig \--cross-prefix=aarch64-w64-mingw32- \--arch=arm64 \--target-os=mingw32 \--prefix=/build/install \--enable-gpl \--enable-nonfree \--disable-doc \--disable-static \--enable-shared \--enable-sdl \--enable-libx264
./configure 输出:
Enabled outdevs:
sdl2
root@0677f504e2da:/build/FFmpeg# make -j12
查看格式:
root@0677f504e2da:/build/FFmpeg# file ./ffmpeg.exe
./ffmpeg.exe: PE32+ executable (console) Aarch64, for MS Windows
6 copy 到win on arm64 电脑上
(base) wmx@wmx-ubuntu:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0677f504e2da mstorsjo/llvm-mingw:latest "/bin/bash" 14 hours ago Up 7 hours friendly_goldstine
复制到本机
docker cp 0677f504e2da:/build/install ./ffmpeg
把 ./ffmpeg 复制到win on arm64 电脑上测试
7 测试
系统:windows on arm
cpu: aarch64
动态库测试
build.bat
@echo off
set LLVM_MINGW_PATH=C:\workspace\llvm-mingw-20240820-ucrt-aarch64
set FFMPEG_PATH=C:/workspace/ffmpeg-6.1\lib
set INCLUDE_PATH=C:/workspace/ffmpeg-6.1\include%LLVM_MINGW_PATH%\bin\clang -o ffmpeg_test_dynamic.exe main.c -I %INCLUDE_PATH% -L %FFMPEG_PATH% -lavcodec -lavformat -lavutilpause
main.c
#include <stdio.h>
#include <libavcodec/avcodec.h>int main() {printf("FFmpeg version: %s\n", av_version_info());return 0;
}
在windows cmd.exe下运行 build.bat 生成 ffmpeg_test_dynamic.exe
把ffmpeg库文件copy到ffmpeg_test_dynamic.exe路径:
C:\workspace\test_ffmpeg>dir |findstr dll
2024/09/04 15:46 11,254,784 avcodec-60.dll
2024/09/04 15:46 135,168 avdevice-60.dll
2024/09/04 15:46 3,683,328 avfilter-9.dll
2024/09/04 15:46 2,167,296 avformat-60.dll
2024/09/04 15:46 678,400 avutil-58.dll
2024/09/04 15:46 44,032 postproc-57.dll
2024/09/04 17:46 2,969,088 SDL2.dll
2024/09/04 15:46 95,744 swresample-4.dll
2024/09/04 15:46 584,192 swscale-7.dll
运行:
C:\workspace\test_ffmpeg>ffmpeg_test_dynamic.exe
FFmpeg version: n6.1
静态链接测试
build_static.bat
@echo off
set LLVM_MINGW_PATH=C:\workspace\llvm-mingw-20240820-ucrt-aarch64
set FFMPEG_PATH=C:/workspace/ffmpeg-6.1\lib
set INCLUDE_PATH=C:/workspace/ffmpeg-6.1\include%LLVM_MINGW_PATH%\bin\clang -o ffmpeg_test_static.exe main.c -I %INCLUDE_PATH% -L %FFMPEG_PATH% -lavcodec -lavformat -lavutil -staticpause
cmd.exe 下运行 build_static.bat 生成 ffmpeg_test_static.exe ,运行:
C:\workspace\test_ffmpeg>ffmpeg_test_static.exe
FFmpeg version: n5.1
msvc 编译测试
buid_msvc.bat
@echo off
REM 配置路径
set FFMPEG_PATH=C:\workspace\ffmpeg-6.1\lib
set INCLUDE_PATH=C:\workspace\ffmpeg-6.1\includeREM 初始化 MSVC 环境,针对 ARM64
::call "C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvarsall.bat" arm64REM 编译 main.c 文件,链接 FFmpeg 库
cl /I %INCLUDE_PATH% main.c /Feffmpeg_msvc.exe /link /LIBPATH:%FFMPEG_PATH% avcodec.lib avformat.lib avutil.libpause
打开窗口 ARM64 Native Tools Command Prompt for VS 2022
C:\workspace\test_ffmpeg>build_msvc.bat
用于 ARM64 的 Microsoft (R) C/C++ 优化编译器 19.41.34120 版
版权所有(C) Microsoft Corporation。保留所有权利。main.c
Microsoft (R) Incremental Linker Version 14.41.34120.0
Copyright (C) Microsoft Corporation. All rights reserved./out:ffmpeg_msvc.exe
/LIBPATH:C:\workspace\ffmpeg-6.1\lib
avcodec.lib
avformat.lib
avutil.lib
main.obj
Press any key to continue . . .C:\workspace\test_ffmpeg>ffmpeg_msvc.exe
FFmpeg version: n6.1C:\workspace\test_ffmpeg>
附录
-mfpu=neon 是一个编译选项,用于指定在 ARM 处理器上使用哪种浮点运算单元 (FPU, Floating Point Unit)。neon 是 ARM 的高级 SIMD (Single Instruction Multiple Data) 指令集扩展,通常用于加速多媒体、信号处理和矩阵运算等高性能计算任务。
具体含义:
-mfpu:用于指定 ARM 处理器的浮点运算单元类型。neon:指的是 ARM 的 NEON 指令集,这是一种 SIMD 扩展,允许一次处理多个数据元素。它可以在同一指令周期内对多个数据点执行相同的运算,从而显著提高处理效率。
NEON 的特点:
- 并行处理:NEON 可以并行处理 64 位或 128 位的数据,从而加速计算。
- 应用场景:常用于图像处理、信号处理、音频解码等多媒体应用。
- 架构支持:通常在 ARMv7 和更高版本的处理器上支持(例如 Cortex-A 系列)。
使用场景:
当编译针对 ARM 处理器的程序时,-mfpu=neon 可以启用 NEON 指令集优化,提升性能,特别是在处理矢量运算、矩阵操作、图像处理等任务时。并非所有 ARM 处理器都支持 NEON,必须确保目标设备的处理器支持 NEON 扩展。aarch64 架构默认支持 NEON,因此在 64 位 ARM 系统中,通常不需要显式指定 -mfpu=neon。
相关文章:
本地电脑交叉编译ffmpeg 到 windows on arm64
本地电脑交叉编译ffmpeg 到 windows on arm64 我这里有编译好的win on arm 的 ffmpeg : https://github.com/wmx-github/ffmpeg-wos-arm64-build 使用 llvm-mingw 工具链 https://github.com/mstorsjo/llvm-mingw/releases 前缀 aarch64-w64-mingw32- 这个库是ubuntu 交叉编译…...
使用 @NotEmpty、@NotBlank、@NotNull 注解进行参数校验
使用 NotEmpty、NotBlank、NotNull 注解进行参数校验 一、前言二、依赖三、使用 NotEmpty、NotBlank、NotNull 注解进行参数校验1. NotNull2. NotEmpty3. NotBlank4. 区别与适用场景 四、实践中的应用五、总结 一、前言 在 Java 开发中,参数校验是确保数据一致性和…...
关于Qt在子线程中使用通讯时发生无法接收数据的情况
在多线程应用中,串口通讯或TCP通讯的场景常常涉及到持续的读写操作,如果子线程处理不当,可能会导致信号阻塞问题。本文将通过串口通讯或TCP通讯为例,详细解释如何在多线程环境中避免信号阻塞,并提供代码示例。 1. 问题…...
HTML:从历史演进到未来创新的网页基石
该论文为AI生成,请勿运用到正式的论文上,以下仅供参考 一、引言 1.1 研究背景 HTML(Hypertext Markup Language)作为网页构建的基础语言,在互联网的发展历程中占据着至关重要的地位。自 1993 年诞生以来,…...
向量的叉积、点积、外积
向量的叉积、点积和外积是向量代数中非常重要的操作,用于描述向量间的关系。它们广泛应用于物理、计算机图形学、几何以及蛋白质结构分析等领域。下面对每个运算进行详细介绍,并通过 PyTorch 示例代码展示其实现。 1. 点积 (Dot Product) 点积是两个向量之间的数量积,结果…...
UNI-APP 溢出隐藏显示省略号
✍经常在项目里面使用到,又没有记住懒得找了,故此写一篇记录一下! CSS单行显示省略号 /* CSS样式 */ .ellipsis {overflow: hidden; /* 隐藏超出的内容 */text-overflow: ellipsis; /* 显示省略号 */white-space: nowrap; /* 不换行 */ } CS…...
SAP学习笔记 - 开发03 - CDSView开发环境搭建,Eclipse中连接SAP,CDSView创建
上一章讲了BTP的账号创建,环境搭建等内容。 SAP学习笔记 - 开发02 - BTP实操流程(账号注册,BTP控制台,BTP集成开发环境搭建)-CSDN博客 本章继续讲SAP开发。 - CDSView 的开发环境(Eclipse)搭建…...
uniapp写的一个年月日时分秒时间选择功能
代码: <template><view><picker mode"multiSelector" :value"multiIndex" :range"multiRange" change"onMultiChange"><view class"picker">当前选择:{{ formattedDateTime }}</vie…...
golang hertz框架入门
两种模式新建项目 1、手动新建项目 2、使用hz工具新建项目 一、手动创建项目,并拉取框架 1、新建项目目录 hertz_demo_w 2、在项目跟目录新建main.go 文件 package mainimport ("context""github.com/cloudwego/hertz/pkg/app""github.…...
Android Home应用程序启动流程
Android系统在启动时安装应用程序的过程,这些应用程序安装好之后,还需要有一个Home应用程序来负责把它们在桌面上展示出来,在Android系统中,这个默认的Home应用程序就是Launcher了,本文将详细分析Launcher应用程序的启…...
C++笔试强训12、13、14
文章目录 笔试强训12一、选择题1-5题6-10题 二、编程题题目一题目二 笔试强训13一、选择题1-5题6-10题 二、编程题题目一题目二 笔试强训14一、选择题1-5题6-10题 二、编程题题目一题目二 笔试强训12 一、选择题 1-5题 引用:是一个别名,与其被引用的实…...
Excel和Word日常使用记录:
Excel使用总结 表格颜色填充: 合并单元格: 选中你要合并的单元格区域。 按下快捷键 Alt H,然后松开这些键。 再按下 M,接着按 C。 这个组合键执行的操作是:Alt H:打开“主页”选项卡。 M:选…...
用Git把本地仓库上传到远程仓库
用Git把本地仓库上传到远程仓库 GitHub创建远程仓库 在创建新仓库界面里输入你的仓库名后点击Create repository就好了。 创建本地项目 当你已经有一个项目后在命令行输入如下指令即可 git init git commit -m "first commit" git branch -M main git remote a…...
OneHotEncoder一个不太合理的地方
OneHotEncoder,在Xtrain上fit,在Xtest上transform 如果遇到某个值出现在Xtest,而没有在Xtrain出现过时,会抛出如下错误: OneHotEncoder Found unknown categories [xxx] in column xx during transform OneHotEncoder …...
如何修复软件中的BUG
笔者上一篇博文《如何开发出一款优秀的软件》主要讲了如何开发一款优秀的软件及相应的必要条件。但对一个已上线,已经成型的产品,该如何解决存在的bug呢?这是本文要阐述的内容。 在这里,首先说一下bug的种类及bug严重程度分类&…...
分享一个基于微信小程序的医院挂号就诊一体化平台uniapp医院辅助挂号应用小程序设计(源码、调试、LW、开题、PPT)
💕💕作者:计算机源码社 💕💕个人简介:本人 八年开发经验,擅长Java、Python、PHP、.NET、Node.js、Android、微信小程序、爬虫、大数据、机器学习等,大家有这一块的问题可以一起交流&…...
HTML生日蛋糕
目录 写在前面 完整代码 代码分析 系列文章 写在最后 写在前面 HTML实现的生日蛋糕来喽,小编亲测,发给好友可以直接打开哦。在代码的第183行可以写下对朋友的祝福,快拿去送给你的好朋友吧! 完整代码 <!DOCTYPE html>…...
【软件逆向】第27课,软件逆向安全工程师之(二)寄存器寻址,每天5分钟学习逆向吧!
寄存器寻址是汇编语言中的一种寻址方式,在这种方式中,操作数位于CPU的寄存器中。寄存器是CPU内部的高速存储位置,用于快速访问数据。以下是关于寄存器寻址的详细信息: 寄存器寻址的特点: 操作数在寄存器中࿱…...
前缀和 — 利用前缀信息解决子数组问题
【前缀和的核心思想是预先处理数组来快速计算任意子数组的和,基本上用于数组和序列问题。】 前缀和算法具体步骤 构造前缀和数组: 给定一个数组nums,其前缀和数组prex定义为prex[i]表示为数组nums从起始位置到第i个位置的元素累加和。构建前…...
2024年最新版Ajax+Axios 学习【包含原理、Promise、报文、接口等...】
基础知识 AJAX概念 AJAX概念:是浏览器与服务器进行数据通信的技术。 认识URL 定义:统一资源定位符,简称网址,用于访问网络上的资源。 组成: http协议:超文本传输协议,规定浏览器和服务器之…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...
linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...
Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...
Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...
2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...
《C++ 模板》
目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板,就像一个模具,里面可以将不同类型的材料做成一个形状,其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式:templa…...
ZYNQ学习记录FPGA(一)ZYNQ简介
一、知识准备 1.一些术语,缩写和概念: 1)ZYNQ全称:ZYNQ7000 All Pgrammable SoC 2)SoC:system on chips(片上系统),对比集成电路的SoB(system on board) 3)ARM:处理器…...
动态规划-1035.不相交的线-力扣(LeetCode)
一、题目解析 光看题目要求和例图,感觉这题好麻烦,直线不能相交啊,每个数字只属于一条连线啊等等,但我们结合题目所给的信息和例图的内容,这不就是最长公共子序列吗?,我们把最长公共子序列连线起…...
