You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unreal Engine 4 如何在运行时从外部文件夹加载音频文件?

运行时加载外部WAV音频文件解决方案

StaticLoadObject 以及 VictoryPlugin 的运行时加载接口本质是加载引擎预制的uasset类型资源,仅能识别引擎虚拟文件系统路径,无法直接读取外部原始WAV文件。你可以通过读取外部WAV二进制数据、手动解析格式、生成runtime可用的USoundWave对象实现需求,具体方案如下:

前置依赖配置

首先在项目模块的.Build.cs文件中添加以下依赖模块:

  • AudioMixer
  • AudioPlatformConfiguration
  • SignalProcessing

实现步骤

  • 第一步:读取外部WAV文件的全量二进制数据,可直接使用FFileHelper工具类实现
  • 第二步:解析WAV头部数据,提取采样率、通道数、位深度、PCM原始数据长度、PCM数据偏移量等核心参数
  • 第三步:创建USoundWave实例,填充解析得到的音频参数,将PCM数据拷贝到SoundWave的RawPCMData内存区域
  • 第四步:将生成的SoundWave添加到Root根对象避免GC回收,直接传入PlaySound2D或音频组件即可正常播放

核心代码示例

// 读取外部WAV文件二进制数据
TArray<uint8> RawWaveData;
FString WavFilePath = TEXT("D:/Your/External/Audio/Path/Test.wav");
if (!FFileHelper::LoadFileToArray(RawWaveData, *WavFilePath))
{
    UE_LOG(LogTemp, Error, TEXT("加载外部WAV文件失败:%s"), *WavFilePath);
    return nullptr;
}

// 解析WAV头(此处省略标准WAV头结构体定义与解析逻辑,可直接复用通用的WAV头解析代码,需校验RIFF、WAVE标识合法性)
FWavHeader ParsedHeader = ParseWavData(RawWaveData.GetData(), RawWaveData.Num());
if (!ParsedHeader.IsValid)
{
    UE_LOG(LogTemp, Error, TEXT("WAV文件格式非法"));
    return nullptr;
}

// 生成运行时可用的SoundWave对象
USoundWave* RuntimeSoundWave = NewObject<USoundWave>(GetTransientPackage(), NAME_None, RF_Public | RF_Standalone);
RuntimeSoundWave->NumChannels = ParsedHeader.ChannelCount;
RuntimeSoundWave->SampleRate = ParsedHeader.SampleRate;
int32 BytesPerSample = ParsedHeader.BitsPerSample / 8;
RuntimeSoundWave->Duration = static_cast<float>(ParsedHeader.PCMDataSize) / (ParsedHeader.SampleRate * ParsedHeader.ChannelCount * BytesPerSample);
RuntimeSoundWave->RawPCMDataSize = ParsedHeader.PCMDataSize;
RuntimeSoundWave->RawPCMData = static_cast<uint8*>(FMemory::Malloc(RuntimeSoundWave->RawPCMDataSize));
FMemory::Memcpy(RuntimeSoundWave->RawPCMData, RawWaveData.GetData() + ParsedHeader.HeaderTotalSize, ParsedHeader.PCMDataSize);

// 避免GC自动回收对象
RuntimeSoundWave->AddToRoot();

// 播放示例:UGameplayStatics::PlaySound2D(GetWorld(), RuntimeSoundWave);

注意事项

  • 音频播放完成不再需要使用时,需手动调用RuntimeSoundWave->RemoveFromRoot()解除根引用,同时调用FMemory::Free(RuntimeSoundWave->RawPCMData)释放手动分配的内存,避免内存泄漏
  • 该方案仅支持无压缩PCM格式的WAV文件,若使用压缩编码的WAV文件,需先完成解码再填充PCM数据
  • 多平台适配可通过IPlatformFile接口处理不同系统的路径格式差异

内容的提问来源于stack exchange,提问作者Antonio Jiménez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 12:27:04