本地电脑交叉编译ffmpeg 到 windows on arm64

2024-09-05 20:36

本文主要是介绍本地电脑交叉编译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

这篇关于本地电脑交叉编译ffmpeg 到 windows on arm64的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1139997

相关文章

sysmain服务可以禁用吗? 电脑sysmain服务关闭后的影响与操作指南

《sysmain服务可以禁用吗?电脑sysmain服务关闭后的影响与操作指南》在Windows系统中,SysMain服务(原名Superfetch)作为一个旨在提升系统性能的关键组件,一直备受用户关... 在使用 Windows 系统时,有时候真有点像在「开盲盒」。全新安装系统后的「默认设置」,往往并不尽编

使用Spring Cache本地缓存示例代码

《使用SpringCache本地缓存示例代码》缓存是提高应用程序性能的重要手段,通过将频繁访问的数据存储在内存中,可以减少数据库访问次数,从而加速数据读取,:本文主要介绍使用SpringCac... 目录一、Spring Cache简介核心特点:二、基础配置1. 添加依赖2. 启用缓存3. 缓存配置方案方案

Mac电脑如何通过 IntelliJ IDEA 远程连接 MySQL

《Mac电脑如何通过IntelliJIDEA远程连接MySQL》本文详解Mac通过IntelliJIDEA远程连接MySQL的步骤,本文通过图文并茂的形式给大家介绍的非常详细,感兴趣的朋友跟... 目录MAC电脑通过 IntelliJ IDEA 远程连接 mysql 的详细教程一、前缀条件确认二、打开 ID

基于Java和FFmpeg实现视频压缩和剪辑功能

《基于Java和FFmpeg实现视频压缩和剪辑功能》在视频处理开发中,压缩和剪辑是常见的需求,本文将介绍如何使用Java结合FFmpeg实现视频压缩和剪辑功能,同时去除数据库操作,仅专注于视频处理,需... 目录引言1. 环境准备1.1 项目依赖1.2 安装 FFmpeg2. 视频压缩功能实现2.1 主要功

使用Java读取本地文件并转换为MultipartFile对象的方法

《使用Java读取本地文件并转换为MultipartFile对象的方法》在许多JavaWeb应用中,我们经常会遇到将本地文件上传至服务器或其他系统的需求,在这种场景下,MultipartFile对象非... 目录1. 基本需求2. 自定义 MultipartFile 类3. 实现代码4. 代码解析5. 自定

Java实现本地缓存的四种方法实现与对比

《Java实现本地缓存的四种方法实现与对比》本地缓存的优点就是速度非常快,没有网络消耗,本地缓存比如caffine,guavacache这些都是比较常用的,下面我们来看看这四种缓存的具体实现吧... 目录1、HashMap2、Guava Cache3、Caffeine4、Encache本地缓存比如 caff

电脑提示d3dx11_43.dll缺失怎么办? DLL文件丢失的多种修复教程

《电脑提示d3dx11_43.dll缺失怎么办?DLL文件丢失的多种修复教程》在使用电脑玩游戏或运行某些图形处理软件时,有时会遇到系统提示“d3dx11_43.dll缺失”的错误,下面我们就来分享超... 在计算机使用过程中,我们可能会遇到一些错误提示,其中之一就是缺失某个dll文件。其中,d3dx11_4

Go语言编译环境设置教程

《Go语言编译环境设置教程》Go语言支持高并发(goroutine)、自动垃圾回收,编译为跨平台二进制文件,云原生兼容且社区活跃,开发便捷,内置测试与vet工具辅助检测错误,依赖模块化管理,提升开发效... 目录Go语言优势下载 Go  配置编译环境配置 GOPROXYIDE 设置(VS Code)一些基本

Windows环境下解决Matplotlib中文字体显示问题的详细教程

《Windows环境下解决Matplotlib中文字体显示问题的详细教程》本文详细介绍了在Windows下解决Matplotlib中文显示问题的方法,包括安装字体、更新缓存、配置文件设置及编码調整,并... 目录引言问题分析解决方案详解1. 检查系统已安装字体2. 手动添加中文字体(以SimHei为例)步骤

java使用protobuf-maven-plugin的插件编译proto文件详解

《java使用protobuf-maven-plugin的插件编译proto文件详解》:本文主要介绍java使用protobuf-maven-plugin的插件编译proto文件,具有很好的参考价... 目录protobuf文件作为数据传输和存储的协议主要介绍在Java使用maven编译proto文件的插件