UE4如何将录制的WAV音频从48kHz立体声转换为16kHz单声道
UE4 WAV音频采样率转换+声道合并实现方案
前置配置
修改项目的[YourProjectName].Build.cs文件,添加依赖模块:
PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "Audio", "AudioMixer", "SignalProcessing" });
核心C++逻辑实现
1. 声道合并(立体声转单声道)
原始录制的48000Hz立体声PCM为交错式存储,每两个连续float分别对应左、右声道采样值,直接取平均值合并为单声道:
// OriginalStereoPCM为蓝图录制得到的原始立体声浮点PCM数据,范围[-1, 1] TArray<float> MergeStereoToMono(const TArray<float>& OriginalStereoPCM) { TArray<float> MonoPCM; if (OriginalStereoPCM.Num() % 2 != 0) { return MonoPCM; } MonoPCM.Reserve(OriginalStereoPCM.Num() / 2); for (int32 i = 0; i < OriginalStereoPCM.Num(); i += 2) { const float LeftSample = OriginalStereoPCM[i]; const float RightSample = OriginalStereoPCM[i + 1]; MonoPCM.Add((LeftSample + RightSample) * 0.5f); } return MonoPCM; }
2. 采样率转换(48000Hz转16000Hz)
调用UE自带的重采样工具完成采样率转换,无需手动实现重采样算法:
TArray<float> ResampleAudio(const TArray<float>& Mono48KPCM) { TArray<float> Resampled16KPCM; const float ResampleRatio = 16000.0f / 48000.0f; const int32 ExpectedOutputFrames = FMath::CeilToInt(Mono48KPCM.Num() * ResampleRatio); Resampled16KPCM.SetNumUninitialized(ExpectedOutputFrames); Audio::FResampler Resampler; Resampler.Init(48000.0f, 16000.0f, 1); int32 ProcessedInputFrames = 0; const int32 ActualOutputFrames = Resampler.Process( Mono48KPCM.GetData(), Mono48KPCM.Num(), Resampled16KPCM.GetData(), ExpectedOutputFrames, ProcessedInputFrames ); Resampled16KPCM.SetNum(ActualOutputFrames); return Resampled16KPCM; }
3. 导出为WAV文件
将处理完成的16000Hz单声道PCM数据写入WAV文件:
bool Save16KMonoToWav(const TArray<float>& Resampled16KPCM, const FString& SavePath) { FWaveFileWriter WavWriter; if (!WavWriter.Open(SavePath, 16000, 1, 16)) { return false; } WavWriter.AppendData(Resampled16KPCM.GetData(), Resampled16KPCM.Num()); WavWriter.Close(); return true; }
蓝图联动方案
将上述逻辑封装为UBlueprintFunctionLibrary的静态函数,仅需暴露「原始PCM数据」「输出文件路径」两个输入参数和「处理结果」布尔值输出参数,即可在你现有蓝图录制逻辑的结束节点后直接调用,不会影响原有音频功能。
注意事项
- 若你获取的原始录制数据为16位整数格式PCM,需先将其归一化到[-1,1]的浮点范围后再执行上述处理。
- 对音频质量要求较高的场景可调整
FResampler的滤波参数,默认参数可满足绝大多数普通业务场景需求。
内容的提问来源于stack exchange,提问作者Dimitrios Ververidis
相关产品推荐
相关产品推荐

