UE4实现录音

UE4实现录音

最近项目中需要时间使用UE4实现录音,发现国内相关资料较少。最终无奈自行解决,在此整理一下解决方案以及解决过程中出现的各种问题

  • 方案一-寻找“官方”途径

基于对UE4的信任,故而相信UE4这种无所不有的引擎应该自带录音功能。之后通过翻阅文档得知UE4中有一个插件叫做VoiceCapture。从名字猜想此插件应当就是录音“官方”途径了。
之后便基于此去查找相关使用方法。在解决过程中发现UE4官方给出的说明极少,只有几个API,几乎无用。于是在维基以及论坛上查询相关内容,最终在论坛上找到了使用方法。原来UE4中有个FVoiceModel类,使用该类的静态函数能get到VoiceCapture,然后使用VoiceCapture类下的函数即能实现语音录制以及播放。具体代码如下:

//VoiceCapture代码

#include "Voice.h"
#include "OnlineSubsystemUtils.h"

// New class member:
TSharedPtr<class IVoiceCapture> voiceCapture;

// Initialisation:
voiceCapture = FVoiceModule::Get().CreateVoiceCapture();
voiceCapture->Start();

// Capturing samples:
uint32 bytesAvailable = 0;
EVoiceCaptureState::Type captureState = voiceCapture->GetCaptureState(bytesAvailable);
if (captureState == EVoiceCaptureState::Ok && bytesAvailable > 0)
{
    uint8 buf[maxBytes];
    memset(buf, 0, maxBytes);
    uint32 readBytes = 0;
    voiceCapture->GetVoiceData(buf, maxBytes, readBytes);

    uint32 samples = readBytes / 2;
    float* sampleBuf = new float[samples];

    int16_t sample;
    for (uint32 i = 0; i < samples; i++)
    {
        sample = (buf[i * 2 + 1] << 8) | buf[i * 2];
        sampleBuf[i] = float(sample) / 32768.0f;
    }

    // Do fun stuff here

    delete[] sampleBuf;
}

如果你觉得这样就能搞定,只能说too young too simple,有趣的才刚刚开始。
这一步之后,发现压根找不到FVoiceModel类。当然,稍有编程基础的都知道是没有包含头文件,那么问题来了,头文件在哪?
我们从上述找到的代码片中发现,include文件是 OnlineSubsystemUntil,那么很明显,FVoiceModel在OnlineSubsystemUntil中了?显然,如果这么简单,那就不用再写下去了,
首先,第一个问题:
问题1.在4.16及以后的版本中,有个更加interesting的问题,你会惊喜的发现,竟然连OnlineSubsystemUntil头文件都找不到,why?
经过查阅相关资料,不难发现,如果我们需要使用OnlineSubsystemUntil,就需要以Model形式添加OnlineSubsystemUntil Model,简单来说,就是在项目的CS文件中添加该Model,具体代码如下:

PrivateDependencyModuleNames.Add("OnlineSubsystemUtils");

添加该Model后编译,之后便能找到OnlineSubsystemUntil.h头文件
PS:部分情况下依旧找不到,原因未知(魔改版C++伤不起)
问题2.在4.16及以后版本中,找到OnlineSubsystemUntil后,查看相关文件,发现其中压根没有VoiceModel类,也就更加没有VoiceCapture类了,so,Why?
经过层层查找,最终我在\Engine\Source\Runtime\Online\Voice\Public\Interfaces中找到了VoiceCapture.h,所以显然,想要使用VoiceCapture,应该直接Include VoiceCapture类。
最终,问题到此为止,算是解决了?
NO!NO!NO!!!
UE4最有意思的地方就在于总是不能让你如意,当你最终决定Include VoiceCapture时,发现编译不通过,Why?
报错显示VoiceCapture中使用了一系列不能识别的库文件,包含一系列不能识别的类。
经过实验,解决方式与上面类似,原因是需要在Model中添加VoiceCapture Model。到此,官方解决算是告一段落。

  • 方案二-使用第三方开源库

经历了上面的过程,我们发现,UE4版本更替太快,倘若使用官方途径,极容易出现今天能用的方法经历一次大版本更新就不再能用。因此,我们可以使用一种较稳定的实现方法:使用第三方库。

猜你喜欢

转载自blog.csdn.net/lz_oases/article/details/78780035
UE4