【转载】UE4 从文件导入音频文件

639 阅读1分钟

版权声明:本文为CSDN博主「东门吹白雪」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:blog.csdn.net/baidu_28938…

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;
}