本地电脑交叉编译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 的特点:

  1. 并行处理:NEON 可以并行处理 64 位或 128 位的数据,从而加速计算。
  2. 应用场景:常用于图像处理、信号处理、音频解码等多媒体应用。
  3. 架构支持:通常在 ARMv7 和更高版本的处理器上支持(例如 Cortex-A 系列)。

使用场景:
当编译针对 ARM 处理器的程序时,-mfpu=neon 可以启用 NEON 指令集优化,提升性能,特别是在处理矢量运算、矩阵操作、图像处理等任务时。并非所有 ARM 处理器都支持 NEON,必须确保目标设备的处理器支持 NEON 扩展。aarch64 架构默认支持 NEON,因此在 64 位 ARM 系统中,通常不需要显式指定 -mfpu=neon

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

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

相关文章

ES配合高德地图JS-API实现地理位置查询

目录 实现功能点 技术选型 具体实现 Vue3整合高德地图JS API-2.0 添加商户&#xff1a;前端 添加商户&#xff1a;后端/ES 查询用户当前地理坐标 获取附近&#xff08;指定距离&#xff09;的商户 总结/测试Demo代码地址 测试概述&#xff1a;用户使用高德地图组件获取商户…

SpringBoot2:学SpringBoot前的知识准备-用IDEA创建传统的webapp工程,并整合SpringMVC

1、IDEA创建工程 基于Maven模板创建的SpringMVC工程 工程创建好后&#xff0c;只有webapp目录 这里&#xff0c;我们需要手动创建java目录和resources配置文件目录 创建好后&#xff0c;配置下目录属性 最终结构 至此&#xff0c;工程就创建好了 2、配置Tomcat 参考&am…

论文笔记:2023顶会SIGIR - Strategy-aware Bundle Recommender System

论文笔记&#xff1a;2023顶会SIGIR - Strategy-aware Bundle Recommender System

【Python报错已解决】`Provisional headers are shown Learn more`

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 引言&#xff1a;一、问题描述&#xff1a;1.1 报错示例&#xff1a;1.2 报错分析&#xff1a;1.3 解决思路&#xff…

145. 利用 Redis Bitmap实践: 用户签到统计

文章目录 一、Redis Bitmap简介二、Bitmap 的主要应用三、Go使用Redis实现签到统计用户签到查询用户签到状态统计今年累计签到天数统计当月的签到情况 总结 在现代应用程序中&#xff0c;用户签到是一个常见的功能。我们通常使用 MySQL 数据库来存储用户的签到记录。然而&#…

智能家居系统(基于STM32F103C8T6标准库+FreeRTOS+Qt串口开发实现)

视频演示&#xff1a;基于STM32F103C8T6标准库FreeRTOSQt串口开发实现的智能家居项目_哔哩哔哩_bilibili 基于STM32F103C8T6标准库FreeRTOSQt串口开发实现的智能家居项目: https://pan.baidu.com/s/1f41gAfOOnlcQoKoMx3o84A?pwd6j2g 提取码: 6j2g 注&#xff1a;本项目为学习完…

Windows I/O系统

硬件存储体系 寄存器 处理器内部定义的存储体&#xff0c;它们除了存储功能&#xff0c;往往还兼有其他的能力&#xff0c;比如参与运算&#xff0c;地址解析&#xff0c;指示处理器的状态&#xff0c;等等。寄存器是由处理器内部专门的触发器电路实现的&#xff0c;处理器往…

自动驾驶坐标转换(代码)

文章目录 1. lidar2ego 和 lidar2cam1.1 lidar2ego1.2 lidar2cam1.3 cam2img2. bev和ego的转换2.1 ego2bev2.2 bev2ego3 3d和2d坐标转换4 车道线插值5 车道线点的过滤6 畸变校正7 绘图7.1 3D lane7.2 绘制2d点1. lidar2ego 和 lidar2cam 1.1 lidar2ego 从.json标注文件中,解…

2024年高教杯国赛(B题)数学建模竞赛解题思路|完整代码论文集合

我是Tina表姐&#xff0c;毕业于中国人民大学&#xff0c;对数学建模的热爱让我在这一领域深耕多年。我的建模思路已经帮助了百余位学习者和参赛者在数学建模的道路上取得了显著的进步和成就。现在&#xff0c;我将这份宝贵的经验和知识凝练成一份全面的解题思路与代码论文集合…

C#基础(2)枚举

前言 我们其实在前面已经了解过枚举到底有什么作用&#xff0c;但是那毕竟是概念性的语言&#xff0c;理解起来很抽象&#xff0c;今天我们会具体来讲一讲枚举&#xff0c;并谈一谈它的应用。 希望你能从今天的C#基础中有所收获。 基本概念 1.枚举&#xff1a;是一个比较特…

基于物联网的低成本便携式传感器节点用于火灾和空气污染的检测与报警

目录 摘要 引言 材料和方法 传感器节点 IoT 微控制器 颗粒物传感器 环境和气体传感器 MQTT代理 Node-Red监控平台 系统结构 数据存储 工作描述 实验结果 讨论 结论 致谢 参考文献 这篇论文的标题是《Low-cost IoT-based Portable Sensor Node for Fire and Air…

数据要素大市场打开新局面——数字经济背景下中国特色的数据产权三权分置

前言 数字经济飞速发展的大背景下&#xff0c;无论是数据要素大市场还是数据资产入表的发展和落地&#xff0c;都需要以数据产权基本制度为保障。对数据产权给与恰当的权利定位&#xff0c;有助于让数据成为创造和捕获价值的新经济资源。数据的价值在于使用&#xff0c;而传统…

链表leetcode-1

目录 1.常用技巧 1.1引入虚拟头结点 1.2对于变量&#xff0c;不要太吝啬&#xff0c;可以多定义&#xff0c;方便处理 1.3快慢双指针 2.例题 2.1两数相加 2.2两两交换链表中的节点 2.3重排链表 2.4合并K个升序链表 2.5K个一组翻转链表 1.常用技巧 1.1引入虚拟头结点 可…

【HTTP、Web常用协议等等】前端八股文面试题

HTTP、Web常用协议等等 更新日志 2024年9月5日 —— 什么情况下会导致浏览器内存泄漏&#xff1f; 文章目录 HTTP、Web常用协议等等更新日志1. 网络请求的状态码有哪些&#xff1f;1&#xff09;1xx 信息性状态码2&#xff09;2xx 成功状态码3&#xff09;3xx 重定向状态码4&…

场景是人工智能第四要素,是垂直领域人工智能的第一要素。

"场景是人工智能的第四要素&#xff0c;与数据、算力、算法同等重要。"拿着技术找场景&#xff0c;还是拿着场景找技术&#xff1f;这个锤子和钉子的问题&#xff0c;一直困扰着各家AI大厂。从近5年的实践来看&#xff0c;拿着场景找技术是更为稳健的&#xff0c;否则…

哪款宠物空气净化器能更好的清理浮毛?希喂、352、IAM测评分享

家里这三只可爱的小猫咪&#xff0c;已然成为了我们生活中不可或缺的家庭成员&#xff0c;陪伴我们度过了说长不长说短不短的五年时光。时常庆幸自己当年选择养它们&#xff0c;在我失落的时候总能给我安慰&#xff0c;治愈我多时。 但这个温馨的背后也有一点小烦恼&#xff0…

ES6语法详解

以下是ES6常用的一些语法和特性&#xff1a; 声明变量的关键字变化&#xff1a;使用let和const、var来声明变量。 箭头函数&#xff1a;使用箭头&#xff08;>&#xff09;定义函数&#xff0c;简化函数的写法。 模板字符串&#xff1a;使用反引号&#xff08;&#xff0…

Numpy中zeros、ones、empty的用法

目录 numpy基础介绍实例分析及结论 numpy基础介绍 Numpy 补充了Python语言所欠缺的数值计算能力,是其它数据分析及机器学习库的底层库。因其完全标准C语言实现&#xff0c;运行效率充分优化。最重要一点是开源免费。numpy的核心是矩阵&#xff08;即多维数组&#xff09;。 实…

【java入门】关键字、标识符与变量初识

&#x1f680; 个人简介&#xff1a;某大型国企资深软件开发工程师&#xff0c;信息系统项目管理师、CSDN优质创作者、阿里云专家博主&#xff0c;华为云云享专家&#xff0c;分享前端后端相关技术与工作常见问题~ &#x1f49f; 作 者&#xff1a;码喽的自我修养&#x1f9…

Android 14(API 级别 34)中,DexClassLoader 不再支持可写 dex/jar 文件

Android 14&#xff08;API 级别 34&#xff09;中&#xff0c;DexClassLoader 不再支持从可写文件加载 dex/jar 文件。这意味着从Android 14开始&#xff0c;你不能再使用 DexClassLoader 来动态加载位于内部存储中的dex/jar文件&#xff0c;除非这些文件被设置为只读。 解决…