版权声明:本文为CSDN博主「东门吹白雪」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
UE4 C++ 导入音频文件
核心 API
FFileHelper::LoadFileToArray
FWaveModInfo::ReadWaveInfo
FMemory::Copy
USoundWave
.h
/// @note 开放接口给蓝图
UFUNCTION(BlueprintCallable, Category = "NormalFunctionLibrary|InputSound")
static class USoundWave* GetSoundWaveFromFile(const FString& filePath);
.cpp
#include "Sound/SoundWave.h"
USoundWave *GetSoundWaveFromFile(const FString &filePath)
{
/// @note 加载音频数据
TArray<uint8> RawWaveData;
if (!FFileHelper::LoadFileToArray(RawWaveData, *filePath))
{
return nullptr;
}
/// @note 提取音频相关参数
FWaveModInfo WaveInfo;
if (!WaveInfo.ReadWaveInfo(RawWaveData.GetData(), RawWaveData.Num()))
{
return nullptr;
}
int32 ChannelCount = (int32)*WaveInfo.pChannels;
check(ChannelCount > 0);
int32 SizeOfSample = (*WaveInfo.pBitsPerSample) / 8;
int32 NumSamples = WaveInfo.SampleDataSize / SizeOfSample;
int32 NumFrames = NumSamples / ChannelCount;
/// ----------------------------------------------
USoundWave *Sound = NewObject<USoundWave>();
/// @note 将数据从 RawWaveData -> Sound
Sound->RawData.Lock(LOCK_READ_WRITE);
void *LockedData = Sound->RawData.Realloc(RawWaveData.Num());
FMemory::Memcpy(LockedData, RawWaveData.GetData(), RawWaveData.Num());
Sound->RawData.Unlock();
/// @note 设定相关参数
Sound->Duration = (float)NumFrames / *WaveInfo.pSamplesPerSec;
Sound->SetSampleRate(*WaveInfo.pSamplesPerSec);
Sound->NumChannels = ChannelCount;
Sound->TotalSamples = *WaveInfo.pSamplesPerSec * Sound->Duration;
return Sound;
}