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

在Unreal Engine 5中用C++无插件实现音频波形数据生成

Unreal Engine 5 音频波形数据提取实现建议

核心实现思路

  • 音频文件加载:用UE5内置的USoundWave类加载本地音频文件,通过LoadSoundWaveFromFile方法直接读取,加载完成后调用InitAudioResource确保原始PCM数据(RawPCMData)可用,这是提取电平的核心数据源。
  • 帧级电平计算:
    1. 先确定你的“帧”对应的时间间隔,比如按30帧/秒的视频标准,每帧对应1/30秒的音频片段。
    2. 根据音频采样率(USoundWave::SampleRate)计算每帧包含的采样点数:每帧采样数 = 采样率 / 帧率。
    3. 遍历PCM原始数据,按每帧采样数分组,对每组计算峰值或均方根(RMS,更贴近人耳感知的电平)。峰值取组内采样值绝对值的最大值;RMS则是先平方所有采样值、求平均后开根号,按需选择即可。
  • 数据存储与复用:把计算好的每帧电平数据存入TArray<float>,后续可直接传给渲染模块生成波形,也能暴露给蓝图调用。

关键代码片段参考

加载音频并获取PCM数据

USoundWave* LoadLocalAudio(const FString& FilePath)
{
    USoundWave* SoundWave = NewObject<USoundWave>();
    if (!SoundWave->LoadSoundWaveFromFile(FilePath))
    {
        UE_LOG(LogTemp, Error, TEXT("Failed to load audio: %s"), *FilePath);
        return nullptr;
    }
    SoundWave->InitAudioResource();
    return SoundWave;
}

计算帧级电平数据

TArray<float> GenerateFrameAudioLevels(USoundWave* SoundWave, int32 TargetFrameRate)
{
    TArray<float> FrameLevels;
    if (!SoundWave || SoundWave->RawPCMData.IsEmpty())
    {
        return FrameLevels;
    }

    int32 SampleRate = SoundWave->SampleRate;
    int32 SamplesPerFrame = SampleRate / TargetFrameRate;
    int32 TotalFrames = SoundWave->RawPCMData.Num() / (SamplesPerFrame * SoundWave->NumChannels);
    
    // 以左声道为例提取数据,多声道可合并为单声道后计算
    for (int32 FrameIdx = 0; FrameIdx < TotalFrames; FrameIdx++)
    {
        float PeakAmplitude = 0.0f;
        int32 StartByte = FrameIdx * SamplesPerFrame * SoundWave->NumChannels * sizeof(int16);
        
        for (int32 SampleIdx = 0; SampleIdx < SamplesPerFrame; SampleIdx++)
        {
            int16 SampleValue = *reinterpret_cast<int16*>(&SoundWave->RawPCMData[StartByte + SampleIdx * SoundWave->NumChannels * sizeof(int16)]);
            float NormalizedAmp = FMath::Abs(static_cast<float>(SampleValue) / 32767.0f); // 16位PCM归一化到0-1范围
            
            if (NormalizedAmp > PeakAmplitude)
            {
                PeakAmplitude = NormalizedAmp;
            }
        }
        
        FrameLevels.Add(PeakAmplitude);
    }

    return FrameLevels;
}

入门学习建议

  • UE5音频API文档:重点啃USoundWave的成员变量和方法,搞懂音频资源的加载流程、PCM数据的存储格式,这是实现的基础。
  • PCM音频基础:先理清采样率、位深、声道数这些概念,比如16位PCM的取值范围是-32768到32767,归一化后才能得到0-1的电平值,避免处理数据时出错。
  • UE5 C++基础:熟悉UObject派生类的生命周期,比如USoundWave的创建和资源初始化逻辑,防止出现空指针或资源未加载的问题。
  • 调试验证:计算完帧数据后,用UE_LOG输出前几帧的电平值,和你给出的示例格式对比,验证逻辑正确性;也可以把数据传到蓝图,用简单UI控件(比如进度条)直观显示每帧电平。

内容的提问来源于stack exchange,提问作者Bob

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 11:40:29