解决UE5在Linux Arm64打包时AVCodecsCore插件缺失FFmpeg库的完整方案 📅 2026/8/5 9:40:17 1. 项目概述当UE5遇上Linux Arm64如果你和我一样正在尝试将Unreal Engine 5项目部署到基于Arm64架构的Linux服务器或设备上那么“打包”这个看似简单的操作很可能已经让你在某个环节卡了壳。特别是当构建日志停在“AVCodecsCore”这个插件上进度条纹丝不动或者直接报出一堆关于平台不支持、库文件缺失的错误时那种感觉真是让人既熟悉又头疼。这不仅仅是UE5的问题更是当前技术生态从传统的x86_64向Arm64架构迁移过程中开发者必然会遇到的“阵痛”之一。这个问题的核心源于UE5引擎内部一个名为“AVCodecsCore”的第三方插件。它本质上是引擎与强大的开源多媒体处理库FFmpeg之间的桥梁负责处理项目中用到的音视频编解码、格式转换等任务。在Windows或Linux x86_64平台上引擎的预编译版本已经为你准备好了所有必要的依赖库。然而当目标平台切换到Linux Arm64时这个“桥梁”的基石——针对Arm64架构预编译的FFmpeg库文件——在引擎的标准分发版里是缺失的。因此打包过程会在此处中断因为它找不到能够在新架构上运行的“零件”。解决这个问题远不止是简单地从网上下载一个.so文件放进去那么简单。它涉及到对UE5构建系统、第三方依赖管理机制的理解以及如何在非标准平台上手动编译和集成原生库。本文将基于我多次在国产化Arm服务器和嵌入式设备上部署UE5应用的实际经验手把手带你拆解这个问题的每一个环节从根因分析到完整的修复方案并提供一套可复现的实操流程。无论你是为国产化信创环境打包还是为树莓派、NVIDIA Jetson等Arm开发板部署UE5应用这套方法都能帮你扫清这个关键障碍。2. 问题根因深度剖析为什么AVCodecsCore会“掉链子”要解决问题必须先理解问题是如何产生的。AVCodecsCore插件在Linux Arm64打包过程中的失败是一个典型的“供应链”断裂问题其根源在于UE5引擎的发布策略与多平台支持的复杂性。2.1 AVCodecsCore插件的角色与依赖链在UE5中任何涉及到播放视频文件如.mp4, .avi、捕获摄像头画面、或者进行实时音视频编码的功能底层很可能都在调用AVCodecsCore插件。这个插件并非虚幻引擎团队从头编写的它是对FFmpeg——这个几乎统治了全球多媒体处理领域的开源项目——的一层C封装。其依赖链非常清晰你的UE5项目- 调用 -AVCodecsCore插件UE5模块- 链接并调用 -FFmpeg共享库.so文件- 依赖 -其他底层系统库如libx264, libvpx等。在Windowsx64和Linuxx86_64上Epic Games在发布引擎的预编译版本无论是通过Epic Games Launcher安装的二进制版本还是从GitHub下载的源码发布版时已经将对应平台的FFmpeg库文件编译好并放在了引擎目录的特定位置例如Engine/Source/ThirdParty/FFmpeg/。因此当你为这些平台打包时构建系统能自动找到并链接正确的库。2.2 Arm64平台的“盲区”与构建系统的行为问题就出在Arm64 Linux这个目标平台上。截至目前Epic Games官方并未在其预编译的引擎版本中提供Arm64架构的FFmpeg库。当你将项目的目标平台设置为“Linux Arm64”并启动打包时UE5的构建系统UnrealBuildTool, UBT会开始工作。它会扫描所有启用的插件包括AVCodecsCore。UBT在尝试为AVCodecsCore插件准备构建环境时会去检查Engine/Source/ThirdParty/FFmpeg/目录下是否存在一个名为ffmpeg-[version]-[platform]-[arch]的文件夹其中就包含预编译好的头文件和库文件。对于Arm64这个文件夹要么不存在要么存在但里面的库文件是x86_64架构的。UBT或后续的链接器ld一旦检测到库文件架构不匹配就会果断报错导致整个打包流程中止。常见的错误信息可能包括Could not find FFmpeg libraries for platform Linux and architecture Arm64.Linking of target ‘AVCodecsCore’ failed.更底层的链接器报错如skipping incompatible /path/to/libavcodec.so when searching for -lavcodec。注意这里有一个关键点即使你在项目设置中禁用了所有视频播放功能只要AVCodecsCore插件本身被引擎或你的某个插件所依赖很多时候是隐式依赖它就会被纳入构建流程。因此彻底解决此问题比在项目里绕开它更为可靠。2.3 手动编译的必要性与挑战既然官方没有提供最直接的解决方案就是自己动手为你的目标Arm64 Linux环境编译一套FFmpeg库。这听起来有点吓人但其实是Linux开发中的常规操作。挑战主要来自两方面交叉编译 vs 本地编译如果你的开发机是x86_64的PC或服务器而目标设备是Arm64你就需要进行交叉编译。这需要配置正确的交叉编译工具链如aarch64-linux-gnu-gcc过程相对复杂。如果你的开发环境本身就是Arm64架构的例如直接在Arm服务器上开发那么本地编译会简单很多。本文将重点介绍在Arm64环境下的本地编译这是最稳定、兼容性最好的方式。版本匹配与功能裁剪UE5的AVCodecsCore插件对FFmpeg的版本和编译配置有特定要求。你不能随意下载一个最新版的FFmpeg编译了事必须使用UE5源码中指定的版本并启用或禁用特定的编解码器以确保接口兼容性和功能正常。理解了这些我们就知道修复之路的核心就是获取正确的FFmpeg源码在Arm64环境中以符合UE5要求的配置进行编译然后将产出的库文件放置到引擎期望的目录结构中。3. 完整修复方案与实操步骤下面我将以在一台运行Ubuntu 22.04 LTSArm64的云服务器或开发板上操作为例展示从零开始修复此问题的全过程。假设你已经在此机器上成功构建了UE5的源码这是为Linux Arm64打包的前提条件。3.1 环境准备与源码定位首先确保你的构建环境是干净且具备编译条件的。安装基础编译工具和依赖sudo apt update sudo apt install -y build-essential cmake git pkg-config nasm \ libx264-dev libx265-dev libvpx-dev libmp3lame-dev libopus-dev \ libfdk-aac-dev libass-dev libssl-dev这些包提供了GCC编译器、CMake、Git以及FFmpeg编译常用的一些编解码器库的开发文件。nasm是汇编器对某些优化编译至关重要。定位UE5引擎源码中的FFmpeg目录 你的UE5源码克隆目录例如~/UnrealEngine是这一切的起点。关键的目录在这里~/UnrealEngine/Engine/Source/ThirdParty/FFmpeg/进入这个目录你会看到一系列以ffmpeg-开头的文件夹如ffmpeg-4.3.2和一个ffmpeg-4.3.2-*.tar.gz的源码压缩包。这个压缩包就是官方指定的FFmpeg源码。同时注意查看是否存在一个名为Linux_Arm64或类似架构的文件夹。通常Linux_x64文件夹是存在的而Linux_Arm64需要我们创建。3.2 编译适用于UE5的FFmpegArm64版本这是最核心的一步。我们不直接解压使用外部的FFmpeg而是使用引擎自带的源码和编译脚本以确保最大兼容性。解压源码并进入目录cd ~/UnrealEngine/Engine/Source/ThirdParty/FFmpeg/ tar -xzf ffmpeg-4.3.2-*.tar.gz cd ffmpeg-4.3.2版本号4.3.2请以你实际看到的为准。配置编译参数 UE5通常提供了编译脚本但为了更清晰地理解我们手动配置。创建一个构建目录并配置mkdir build_arm64 cd build_arm64 ../configure \ --prefix$(pwd)/install \ --archaarch64 \ --target-oslinux \ --enable-cross-compile \ --cross-prefixaarch64-linux-gnu- \ --enable-shared \ --disable-static \ --disable-programs \ --disable-doc \ --disable-avdevice \ --disable-swresample \ --disable-postproc \ --disable-avfilter \ --disable-alsa \ --disable-libxcb \ --disable-libxcb-shm \ --disable-libxcb-xfixes \ --disable-libxcb-shape \ --disable-sdl2 \ --disable-zlib \ --disable-bzlib \ --disable-lzma \ --enable-gpl \ --enable-libx264 \ --enable-libx265 \ --enable-libvpx \ --enable-libmp3lame \ --enable-libopus \ --enable-libfdk-aac \ --enable-libass \ --enable-openssl \ --extra-cflags-I/usr/include/aarch64-linux-gnu \ --extra-ldflags-L/usr/lib/aarch64-linux-gnu参数解析--prefix指定编译后库文件的安装目录。--arch和--target-os明确指定目标架构和系统。--cross-prefix如果你在x86_64上为Arm64交叉编译这里需要指定交叉编译工具链的前缀。如果你已经在Arm64机器上这一行应该去掉因为我们是本地编译。--enable-shared和--disable-static生成动态链接库.so这是UE5插件所需要的。--disable-programs等禁用我们不需要的工具和组件简化编译减少依赖和体积。--enable-gpl和--enable-libx264等启用GPL许可证的代码和一些常用的、UE5可能依赖的编解码器。请根据你的项目实际需求和许可证合规性进行调整。--extra-cflags和--extra-ldflags指定交叉编译时头文件和库的搜索路径。本地编译时系统通常能自动找到。重要调整如果你是在Arm64本地环境编译简化后的配置命令可能如下../configure \ --prefix$(pwd)/install \ --enable-shared \ --disable-static \ --disable-programs \ --disable-doc \ --disable-avdevice \ --disable-swresample \ --disable-postproc \ --disable-avfilter \ --enable-gpl \ --enable-libx264 \ --enable-libvpx \ --extra-cflags-O3 \ --extra-ldflags-Wl,-rpath-link,/usr/lib/aarch64-linux-gnu执行编译与安装make -j$(nproc) # 使用所有CPU核心并行编译加快速度 make install编译完成后在build_arm64/install/lib目录下你应该能看到libavcodec.so,libavformat.so,libavutil.so,libswscale.so等关键的FFmpeg动态库文件。3.3 将编译好的库集成到UE5引擎中现在我们需要让UE5的构建系统知道我们有了Arm64的FFmpeg库。创建目标平台目录结构 回到Engine/Source/ThirdParty/FFmpeg/目录。参照Linux_x64文件夹的结构为Arm64创建对应的目录。cd ~/UnrealEngine/Engine/Source/ThirdParty/FFmpeg/ mkdir -p Linux_Arm64/include Linux_Arm64/lib/aarch64-unknown-linux-gnueabi目录名Linux_Arm64和子目录结构是UE5构建系统所期望的。aarch64-unknown-linux-gnueabi是典型的Arm64 GNU ABI名称。复制头文件和库文件复制头文件cp -r ffmpeg-4.3.2/build_arm64/install/include/* Linux_Arm64/include/复制库文件cp ffmpeg-4.3.2/build_arm64/install/lib/lib*.so Linux_Arm64/lib/aarch64-unknown-linux-gnueabi/同时建议将.so文件的主版本符号链接也创建好有时链接器需要cd Linux_Arm64/lib/aarch64-unknown-linux-gnueabi for lib in libavcodec.so libavformat.so libavutil.so libswscale.so; do ln -sf $lib.58 $lib # 版本号58可能因FFmpeg版本而异请根据实际文件修改 done验证库文件架构 使用file命令确认库文件确实是Arm64架构。file Linux_Arm64/lib/aarch64-unknown-linux-gnueabi/libavcodec.so.58输出应包含ELF 64-bit LSB shared object, ARM aarch64字样。3.4 触发引擎重新构建AVCodecsCore插件仅仅放置库文件还不够需要让UE5的构建系统重新生成或至少重新链接AVCodecsCore插件模块。清理旧的构建中间文件可选但推荐cd ~/UnrealEngine ./Engine/Build/BatchFiles/Linux/RunUAT.sh BuildGraph -targetMake Installed Build LinuxArm64 -clean或者更直接地删除插件相关的中间文件rm -rf Engine/Intermediate/Build/Linux/ARM64/AVCodecsCore/ rm -rf Engine/Binaries/Linux/ARM64/AVCodecsCore.*重新构建插件 最可靠的方式是通过构建引擎的特定目标来触发插件的重新编译。你可以运行cd ~/UnrealEngine ./Engine/Build/BatchFiles/Linux/Build.sh AVCodecsCore Linux ARM64 Development -WaitMutex -Verbose这个命令会专门构建AVCodecsCore插件。如果一切顺利你会在输出中看到它成功链接了我们刚刚提供的Arm64 FFmpeg库。4. 项目打包验证与深度排查完成上述步骤后就可以回到你的UE5项目进行打包测试了。4.1 执行打包命令在你的项目根目录下使用命令行执行打包~/UnrealEngine/Engine/Build/BatchFiles/Linux/RunUAT.sh BuildCookRun -project/path/to/YourProject.uproject -noP4 -platformLinuxArm64 -clientconfigDevelopment -serverconfigDevelopment -build -cook -stage -pak -archive -archivedirectory/path/to/Output观察输出日志。重点查看是否有关于AVCodecsCore或FFmpeg的错误。如果编译和链接阶段顺利通过打包流程会继续进行下去。4.2 常见问题与排查技巧实录即使按照步骤操作也可能会遇到一些意外情况。以下是我在实际操作中踩过的坑和解决方案问题1编译FFmpeg时configure报错提示找不到libx264等开发包。排查这通常是因为虽然安装了libx264-dev但它是x86_64版本的。在Arm64原生系统上需要确认安装的是Arm64架构的开发包。使用dpkg -l | grep libx264-dev查看架构。解决确保你的APT源包含了Arm64的软件包并使用sudo apt install libx264-dev:arm64如果支持多架构或直接sudo apt install libx264-dev在纯Arm64系统上。对于其他缺失的库如libfdk-aac-dev可能需要添加额外的软件源如universe仓库。问题2UE5构建插件时链接器报错 “undefined reference toavcodec_receive_frame...”。排查这通常是FFmpeg库版本不匹配或ABI不兼容的典型症状。UE5的AVCodecsCore插件源码是针对特定FFmpeg版本如4.3.2的API编写的。如果你编译的FFmpeg版本过高或过低或者编译时启用的功能集与插件预期不符就会导致符号找不到。解决绝对不要使用非引擎指定的FFmpeg版本。务必使用Engine/Source/ThirdParty/FFmpeg/目录下提供的源码包。其次检查你的configure参数尽量与UE5官方为x86_64版本使用的参数保持一致。你可以参考Linux_x64目录下可能存在的build.txt或Readme.txt文件或者查看引擎中AVCodecsCore插件的.Build.cs文件看是否有关于FFmpeg特性的定义。问题3打包成功但在目标Arm64设备上运行时崩溃报错libavcodec.so.58: cannot open shared object file。排查这是一个运行时依赖问题。打包过程只负责将库文件“归档”到Pak文件或可执行文件旁边但Linux系统的动态链接器ld在运行时需要能找到它们。解决有几种方法设置rpath在编译FFmpeg时通过--extra-ldflags-Wl,-rpath,\$ORIGIN/ThirdParty/FFmpeg/LinuxArm64/lib/aarch64-unknown-linux-gnueabi将库的搜索路径硬编码到.so文件中。这样可执行文件会在其所在目录的相对路径下查找库。修改打包脚本确保Stage阶段将编译好的Linux_Arm64/lib/目录下的所有.so文件复制到打包输出目录的合适位置例如YourGame/Binaries/LinuxArm64/或YourGame/ThirdParty/FFmpeg/。修改系统链接器配置在目标设备上将库文件路径添加到/etc/ld.so.conf.d/下的一个配置文件中然后运行sudo ldconfig。但这在分发应用时不推荐。问题4为不同的Arm64 Linux发行版如Ubuntu、CentOS、OpenEuler编译需要注意什么排查与解决不同发行版的C运行库glibc版本、系统库路径可能不同。最保险的方法是在与你目标设备操作系统版本尽可能一致的环境中进行编译。如果必须交叉编译你需要准备一个与目标系统匹配的sysroot包含目标系统的所有头文件和库并在configure时通过--sysroot参数指定。这是一个更高级的话题但对于嵌入式或严格的国产化环境部署至关重要。5. 进阶优化与长期维护建议一次性修复问题固然好但建立一个可持续的流程更重要。1. 创建自动化编译脚本 将上述FFmpeg编译和库文件复制步骤写成一个Shell脚本例如build_ffmpeg_for_ue5_arm64.sh。这样在新的构建机器上或者UE5引擎升级后你可以快速重现整个过程。脚本里应该包含清晰的参数定义、错误检查以及日志输出。2. 集成到CI/CD管道 如果你使用Jenkins、GitLab CI等持续集成系统可以将修复步骤作为打包流水线的一个前置任务。在构建代理必须是Arm64架构的代理上自动执行FFmpeg的编译和部署确保每一次打包都是基于正确配置的环境。3. 管理多版本FFmpeg库 在Engine/Source/ThirdParty/FFmpeg/下你的Linux_Arm64文件夹可能会随着UE5版本升级而需要更新。一个好的实践是将你自定义编译的库文件目录备份并记录下编译时的确切配置参数、系统环境如gcc版本、依赖库版本。当升级UE5引擎后首先检查新版本是否官方提供了Arm64库。如果没有用备份的参数在新环境下重新编译一次。4. 深入理解UBT构建规则 对于想彻底掌控过程的开发者可以研究AVCodecsCore插件的.Build.cs文件通常位于Engine/Plugins/Media/AVCodecsCore/Source/AVCodecsCore/看看它是如何定义对FFmpeg的依赖的。你甚至可以尝试修改它以更灵活地指定库文件路径但这需要较强的UE5模块构建知识。修复UE5在Linux Arm64打包时的AVCodecsCore问题本质上是一次对引擎底层依赖管理的深度实践。它强迫你跳出编辑器的舒适区去理解从源码到二进制产物的完整链条。这个过程虽然繁琐但带来的收益是巨大的你不仅解决了眼前的问题更获得了在非标准平台上部署复杂C应用的能力这对于从事边缘计算、嵌入式图形、国产化软件适配等领域的开发者来说是一项极具价值的技能。下次再遇到类似的第三方库平台兼容性问题你就能从容地按照“定位依赖 - 获取源码 - 为目标平台编译 - 集成到构建系统”这个通用思路去解决了。