解决UE5在Linux Arm64打包时AVCodecsCore插件缺失FFmpeg库的完整方案
2026/8/5 9:40:13 网站建设 项目流程

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++封装。

其依赖链非常清晰:

  1. 你的UE5项目-> 调用 ->AVCodecsCore插件(UE5模块)-> 链接并调用 ->FFmpeg共享库(.so文件)-> 依赖 ->其他底层系统库(如libx264, libvpx等)

在Windows(x64)和Linux(x86_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开发中的常规操作。挑战主要来自两方面:

  1. 交叉编译 vs 本地编译:如果你的开发机是x86_64的PC或服务器,而目标设备是Arm64,你就需要进行交叉编译。这需要配置正确的交叉编译工具链(如aarch64-linux-gnu-gcc),过程相对复杂。如果你的开发环境本身就是Arm64架构的(例如直接在Arm服务器上开发),那么本地编译会简单很多。本文将重点介绍在Arm64环境下的本地编译,这是最稳定、兼容性最好的方式。
  2. 版本匹配与功能裁剪:UE5的AVCodecsCore插件对FFmpeg的版本和编译配置有特定要求。你不能随意下载一个最新版的FFmpeg编译了事,必须使用UE5源码中指定的版本,并启用或禁用特定的编解码器,以确保接口兼容性和功能正常。

理解了这些,我们就知道,修复之路的核心就是:获取正确的FFmpeg源码,在Arm64环境中以符合UE5要求的配置进行编译,然后将产出的库文件放置到引擎期望的目录结构中。

3. 完整修复方案与实操步骤

下面,我将以在一台运行Ubuntu 22.04 LTS(Arm64)的云服务器或开发板上操作为例,展示从零开始修复此问题的全过程。假设你已经在此机器上成功构建了UE5的源码(这是为Linux Arm64打包的前提条件)。

3.1 环境准备与源码定位

首先,确保你的构建环境是干净且具备编译条件的。

  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是汇编器,对某些优化编译至关重要。

  2. 定位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的FFmpeg(Arm64版本)

这是最核心的一步。我们不直接解压使用外部的FFmpeg,而是使用引擎自带的源码和编译脚本,以确保最大兼容性。

  1. 解压源码并进入目录

    cd ~/UnrealEngine/Engine/Source/ThirdParty/FFmpeg/ tar -xzf ffmpeg-4.3.2-*.tar.gz cd ffmpeg-4.3.2

    版本号(4.3.2)请以你实际看到的为准。

  2. 配置编译参数: UE5通常提供了编译脚本,但为了更清晰地理解,我们手动配置。创建一个构建目录并配置:

    mkdir build_arm64 && cd build_arm64 ../configure \ --prefix=$(pwd)/install \ --arch=aarch64 \ --target-os=linux \ --enable-cross-compile \ --cross-prefix=aarch64-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"
  3. 执行编译与安装

    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库。

  1. 创建目标平台目录结构: 回到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名称。

  2. 复制头文件和库文件

    • 复制头文件:
      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
  3. 验证库文件架构: 使用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插件模块。

  1. 清理旧的构建中间文件(可选但推荐):

    cd ~/UnrealEngine ./Engine/Build/BatchFiles/Linux/RunUAT.sh BuildGraph -target="Make Installed Build LinuxArm64" -clean

    或者,更直接地删除插件相关的中间文件:

    rm -rf Engine/Intermediate/Build/Linux/ARM64/AVCodecsCore/ rm -rf Engine/Binaries/Linux/ARM64/AVCodecsCore.*
  2. 重新构建插件: 最可靠的方式是通过构建引擎的特定目标来触发插件的重新编译。你可以运行:

    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 -platform=LinuxArm64 -clientconfig=Development -serverconfig=Development -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仓库)。

问题2:UE5构建插件时,链接器报错 “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.txtReadme.txt文件,或者查看引擎中AVCodecsCore插件的.Build.cs文件,看是否有关于FFmpeg特性的定义。

问题3:打包成功,但在目标Arm64设备上运行时崩溃,报错libavcodec.so.58: cannot open shared object file

  • 排查:这是一个运行时依赖问题。打包过程只负责将库文件“归档”到Pak文件或可执行文件旁边,但Linux系统的动态链接器(ld)在运行时需要能找到它们。
  • 解决:有几种方法:
    1. 设置rpath:在编译FFmpeg时,通过--extra-ldflags="-Wl,-rpath,\$ORIGIN/ThirdParty/FFmpeg/LinuxArm64/lib/aarch64-unknown-linux-gnueabi"将库的搜索路径硬编码到.so文件中。这样,可执行文件会在其所在目录的相对路径下查找库。
    2. 修改打包脚本:确保Stage阶段将编译好的Linux_Arm64/lib/目录下的所有.so文件复制到打包输出目录的合适位置(例如YourGame/Binaries/LinuxArm64/YourGame/ThirdParty/FFmpeg/)。
    3. 修改系统链接器配置:在目标设备上,将库文件路径添加到/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++应用的能力,这对于从事边缘计算、嵌入式图形、国产化软件适配等领域的开发者来说,是一项极具价值的技能。下次再遇到类似的第三方库平台兼容性问题,你就能从容地按照“定位依赖 -> 获取源码 -> 为目标平台编译 -> 集成到构建系统”这个通用思路去解决了。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询