[虚幻引擎]实时音频播放

Part1前言

虚幻引擎支持音频的播放,但是在实时音频播放的场景,目前我没有找到比较好的方案。最近研究了一下,通过FAudioDeviceManager可以实现对实时音频的播放。

Part2FAudioDeviceManager介绍

在虚幻引擎(Unreal Engine)中,FAudioDeviceManager 是一个核心类,负责管理和维护所有音频设备实例。这个类在引擎的音频系统中发挥着至关重要的作用,尤其是在处理复杂的音频播放场景和管理多个音频设备时显示其重要性。FAudioDeviceManager 的主要功能包括管理多个音频设备,这对于在复杂项目中支持多种音频输出,如同时处理游戏音效和用户界面(UI)音效等方面至关重要。它还负责音频资源的分配和释放,确保音频资源的有效利用和防止内存泄漏。

此外,FAudioDeviceManager 能够根据需要创建新的音频设备或销毁不再使用的设备,并负责音频上下文之间的切换,比如在不同游戏场景或应用上下文间切换时管理相应的音频设备。它还提供了接口来配置音频设备的属性,包括音量、混音、空间化设置等,并管理各种音频播放事件,如启动、停止、暂停、恢复播放等。

FAudioDeviceManager 在游戏和交互式应用中扮演着关键角色,处理不同类型的音频需求,如背景音乐、效果音和语音聊天。在虚拟现实(VR)和增强现实(AR)等场景中,它帮助处理空间音频,为用户提供更加沉浸式的体验。同时,它还提供了必要的工具和接口,用于音频编辑和调试。

在编程实践中,虽然开发者通常不需要直接与 FAudioDeviceManager 交互,除非进行底层的音频系统开发或自定义音频功能,但理解其存在和作用对于深入了解虚幻引擎的音频系统非常有帮助。在标准游戏开发过程中,音频处理大多是通过更高级别的抽象完成,如音频组件(UAudioComponent)和声音类(USoundClass、USoundCue等)。总的来说,FAudioDeviceManager 是虚幻引擎音频系统中不可或缺的一部分,为创造丰富、动态的音频体验提供了强大的支持。

Part3音频格式

实时音频我们采用pcm格式进行播放,其他音频格式可以自行解码成pcm编码。

脉冲编码调制(Pulse Code Modulation, PCM)是一种将模拟音频信号转换为数字音频信号的技术。这种转换过程涉及对模拟信号进行规律性采样和量化的步骤。在采样过程中,PCM技术以固定的时间间隔(称为采样率)测量模拟信号的幅值,而采样率的高低直接决定了音频质量和文件大小。例如,标准CD音质的采样率为44.1千赫兹(kHz),这意味着每秒钟采样44100次。量化过程则是将每次采样的模拟幅值转换成数字表示,这通常以位深(比特数)来衡量。位深决定了音频的动态范围,即音频中最大和最小可区分声音级别之间的范围,常见的位深包括16位或24位。

PCM音频的一个主要特点是它是未压缩的,这意味着它能提供高保真度的音质,但相对于压缩格式如MP3或AAC,它占用的存储空间更大。这种高保真的特性使得PCM成为专业音频制作和声音工程中的首选格式,同时也是许多数字音频接口和存储媒体的标准格式。例如,WAV(适用于Windows系统)和AIFF(适用于Apple系统)文件格式,就是基于PCM的常见音频文件格式。

PCM音频的广泛应用范围包括音乐制作、电影和电视广播、电话通信以及在计算机和移动设备中的音频播放。尽管文件大小较大,但它提供的无损音质使得音频专业人士和高品质音频爱好者常常优先选择PCM格式。随着数字存储技术的发展和成本的降低,PCM格式的音频文件也变得更加易于存储和传输,进一步巩固了其在数字音频领域的重要地位。

Part4文件简介

这里我开发了一个插件,我将几个文件进行一下介绍。
1 ATestVoiceChatSubmixListener 测试类,音频播放的使用demo
2 FVoiceChatSubmixListener 封装了音频播放的核心代码
3 FVoiceChatMixerDevice 定义了音频模块,主要设置音频采样率

Part5调用方法

//创建播放对象
 SubmixListener = MakeShareable(new FVoiceChatSubmixListener());
//设置音频采样率
 SubmixListener->SetSampleRate(4096);
//激活播放对象
 SubmixListener->Activate();
//设置音频参数 这里采样率为4096 单通道 pcm编码 4字节采样
 FWaveFormatInfo WaveInfo;
 WaveInfo.SamplesPerSecond = 4096;
 WaveInfo.NumChannels =1;
 WaveInfo.BitsPerSample = 32;
 WaveInfo.SampleType = 1;
 SubmixListener->AddNewWave(WaveInfo);
//读取音频文件
 FString FilePath = "C:\\Users\\dell\\Desktop\\output.pcm";
 TArray BinaryData;
 if (false == FFileHelper::LoadFileToArray(BinaryData, *FilePath))
 {
  UE_LOG(LogTemp, Error, TEXT("LoadFileToArray"));
  return;
 }
// 播放音频文件
 SubmixListener->AppendStream(BinaryData.GetData(), BinaryData.Num());

Part6关于源码

请关注公众号g0415shenw 加入知识星球。
星球地址 https://t.zsxq.com/15BW2QCwY

你可能感兴趣的:(虚幻,音视频,java,游戏引擎,开发语言)