UDN
Search public documentation:

AudioSystemCH
English Translation
日本語訳
한국어

Interested in the Unreal Engine?
Visit the Unreal Technology site.

Looking for jobs and company info?
Check out the Epic games site.

Questions about support via UDN?
Contact the UDN Staff

UE3 主页 > 音频主页 > 音频系统

音频系统


概述


虚幻引擎 3 的音频系统由一个音频基类 UAudioDevice 构成。基类的实现负责一些基本的逻辑,比如添加和删除 UAudioComponent 对象。UAudioComponent 对象是可以在 UAudioDevice 上播放的内容。UAudioComponent 对象包含着 USoundCue 对象,而 USoundCue 引用了包含实际音频数据的 USoundNode 对象(也就是 USoundNode 包含着实际的音频数据) 。

在音频设备类中的针对特定平台的虚幻引擎 3 的音频代码都继承于音频基类 UAudioDevice。目前有针对 3 个特定平台的音频设备: UALAudioDevice (OpenAL PC)、UXeAudioDevice (XBox360) 和 UPS3AudioDevice (PlayStation3)。

所有的平台支持一个可选的基于每个源的低通滤波器、基于每个总线产生混响效果、基于每个总线的 EQ 过滤器和多通道 (4.0, 5.1, 6.1 和 7.1) 声音(如果硬件允许)。这样的目的是使得所有的平台尽可能地接近。

音频基类的实现可以在 Engine\Src\UnAudio.cpp 中找到,它的定义在 Engine\Inc\UnAudio.h 中。 基本音频组件的实现可以在 Engine\Src\UnAudio.cpp 找到,声明可以在 Engine\Inc\UnActorComponent.h 中找到。

常用概念


Audio Device(音频设备)

正如上面所描述的,这是音频系统的主要接口。它维护这一系列加载的资源,处理收听者并管理声源。

  • Init - 初始化硬件,分配通道以及其它为了听到音频所需要做的工作。
  • TearDown - 关闭硬件并把释放所有资源给系统。
  • Update - 更新接收者的位置、方向和速度。
  • Exec - 处理运行任何输入到控制台的调试命令。

UAudioDevice::Update 是声音系统的主要“更新函数”。它将迭代监听所有活动的 AudioComponents(引擎要播放的声音),根据它们的优先级进行排序,然后更新声源或启动一个新的声音。它也处理所有的基本管理及暂停操作。

Sound Sources(声源)

Sound Sources(也成为声音)代表用于混合到最终输出的一个单独声音。声源的数量是有限制的,根据硬件限制或者通过配置文件进行定义。每个声源都有一个位置、音量、音调和速度属性。所有平台的默认 MaxChannels(最大通道)数为 32,该数量被限定在 1 到 64 之间。设置 MaxChannels(最大通道)为 0 是获取所有音频代码的最快方法。

  • Init - 找到要播放的声音资源,并把它提交给硬件。
  • Update - 把引擎中的音量、音调、位置和速度信息更新到硬件中。
  • Play - 开始播放声源。
  • Stop - 停止播放声源。
  • Pause - 暂停这个声源的播放。
  • IsFinished - 处理声音的结束、根据需要发送通知并且使队列缓存加倍。

Sound Buffers(声音缓冲)

Sound Buffers 是波形数据的容器。控制台命令 "ListSounds" 将会显示当前加载的素有波形及它们的格式。如果内存允许,可以由无限数量的波形。这些波形的进入通常有两种基本类型: 当声音系统完全地包含所有的数据并且引擎具有最小控制时声音进入内存;当引擎需要知道声音什么时候进行循环或者什么时候进行实时地解压时开始把声音进行排队(也就是在 PC 上解压 ogg vorbis 格式的文件)。

  • Init - 放置声音资源并根据需要进行加载。

UAudioComponent(音频组件)

AudioComponents 主要介绍了引擎如何和音频设备进行交互。当引擎要播放声音时,它调用 UAudioDevice::CreateComponent 并设置返回的结构体的属性。这个结构体然后被附加到 actor 的一系列组件上以便稍后进行管理。如果向 UAudioDevice::CreateComponent 函数中传递一个位置,将会进行简单的距离剔除检测来判断声音是否很短,以及组件是否被创建。通常检测 UAudioDevice::CreateComponent 返回的值是否为 NULL 是很重要的,因为这可以判断使用 -nosound 禁用音频时的运行状况。

UAudioComponent 中最重要的变量是

class USoundCue* SoundCue; //要播放的声音
BITFIELD bUseOwnerLocation:1; //空间化这个声音到附加这个声音的 actor 的位置处。
BITFIELD bAllowSpatialization:1; //在3d空间中空间化这个声音。
FVector Location; // Location to use for spatialisation if not attached
FVector ComponentLocation; //如果声音附加到了 actor 上,使用这个位置进行空间化处理。

Sound Classes(声音类别)

每个声效都可以被分配给在包 Content\Sounds\SoundClassesAndModes.upk 中定义的一个声音类别。声效类的这些特定的属性和层次放置在 FSoundClassProperties 类中。这些属性及层次和传递给所有子节点的某些父类属性在同一个层次中。根声音类别成为 "Master",并且它是必需的。

可以建立这些层次,并在声音类编辑器中改变属性。它的工作方式和声效编辑器是类似的。

这些组可以用于应用于音量 和/或 音调的调整。UTGame 的测试地图 "DM-SoundMode" 可以解释这个应用;在命令行中调用 SetSoundMode'lowpass', 'bandpass', 'highpass', 'quick' 和 'slow'来了解它的工作原理。其中的一个警告是声音类的属性不能在层次结构上起作用。

Reverb Effect(混响效果)

这些是以不考虑特定平台的情况下实现的,可以根据需要使用目标平台可以使用的参数。参数定义在代码中的 FAudioEffectsManager::ReverbPresets 表格中。在 UnPlayer.cpp 中,代码获得玩家所在的 Reverb volumes(混响体积)的混响设置,并把这些设置传递到 FAudioEffectsManager::SetReverbSetting 进行插值,再传递到特定的平台层次。因为对参数进行了插值,所以没有混响中断。混响体积可以通过右击画刷并选择“Add Volume(添加体积)” --> “Reverb Volume(混响体积)”来创建。_FAudioEffectsManager_ 是基类;特定平台的接口从它那继承而来。

AmbientZone Effects(环境区域特效)

现在 Reverb volumes(混响体积)合并‘AmbientZone(环境区域)’设置;这些有用模仿环境声音的遮挡。当在内部时,可以把 Volume(体积) 和/或 低通滤波器效果应用到外面的声音上,反之当在外部时把它们应用到里面的声音上。比如,您可以放置一个巨大的室外环境声音风声的效果来覆盖到整个关卡中,但是当玩家移动到内部时,风声将会渐弱,并且和玩家在同一个体积内的声音将会渐强。

要获取更多文档资料,请查看使用环境区域页面。

DistanceModel Attenuation(距离模型衰减)

Attenuation(衰减)是指当玩家远离一个声音过程中声音变弱的能力–衰减的速率在 DistanceModel 属性中进行定义。

请参阅DistanceModel Attenution(距离模型衰减)页面了解更多信息。

Low Pass Filter(低通滤波器)

目前这是通过衰减声音节点实现的。它有一个标志用于启用这个功能,还有要使用的最小和最大距离。它实际上是作为高架滤波器来实现的,当它在最小距离时不对任何东西进行插值,当在最大距离是它将对高频率部分进行插值。

Sound Modes(声音模型)

声音模型随着时间变化改变一组声音类。声音组是声音类的已经废弃的别名(因为这容易和包中的组混淆)比如 Ambient 和 Weapon。

您可以使用声音修改功能设立一系列的声音类效果。比如,过场动画会话,可以在对话时提高音量,降低特效的音量(这些不能层次上进行应用)。设置声音模型在第一次延迟后开始淡入模型(在整个淡入时间内),持续一段时间,然后淡出为默认值(在整个淡出时间)。当时间间隔小于 0 时,意味着在另一个模型被设置之前将一直持续这个模型。您应该有一个称为 soundmodes(声音模型)的包,它具有默认的 soundmode(声音模型)入口;可以把新的声音模型添加到那个包中。新的声音模型可以通过游戏脚本进行触发。

UDKGame 中的地图 SoundMode 可以充分地说明这个问题。运行该地图,并在命令行中输入 'setsoundmode quick'、'setsoundmode slow' 或者 'setsoundmode loud'。您可以在 PIE 中运行它,并且可以在到处查看的过程中编辑或创建您自己的声音模型。

以下是音量调节的应用实例。

Volume Ducking(音量调整控制)

Volume Ducking 通常会降低除了您想听到的声音以外的所有其它声音,通常这个声音是对话(但不仅限于电影中)。它通常可以控制:

  • 识别导致音量调整的声音组(对话)。
  • 当来自那个组的某个声音被触发后,其它的组将会在 X 秒后降低相应的音量( FadeStartTime = 0.3 秒)。
  • 其它组降低音量得多少( FadeAmount = -0.4)。
  • 当 docking 组的声音停止时,其它组的音量在 X 秒后返回为正常值( FadeStopTime = 0.2 秒)。
  • 也许您也想使得某些声音组在 ducking 过程不受到影响(比如音乐),或者名称为 Exceptions 不受影响。

如果不想在 Volume(音量)上限制上面的系统,可以通过添加 Pitch(音调)、EQ 以及其它的滤波器来获得对该模型系统的更多控制。

比如,在电影的高声部分(比如,战斗中),当有一个正常音量的一个人和另一个人的对话切入时,您仍然可以听到那个人的声音,因为它们已经 ducked(降低) 了所有其它的声音。当对话的声音播放的较大时,所有的战斗/环境/特效的声音都将播放的比较小。

在游戏中,您会 duck(调整) 环境声音组(及其它组)的声音。

导入声音


引擎目前支持以任何速率导入未压缩的小尾字节序 16 位的波形文件。

规格  
格式 .Wav
位速率 16
扬声器通道 Mono, Stereo, 2.1, 4.1, 5.1 6.1, 7.1

导入时使用正常的声音工厂将会产生一个简单的可以被声效引用来进行播放的声音节点波形。这些声音可以是单声道的也可以是立体声的。导入时使用特殊的命名规则可以产生可能的多通道声音(比如 5.1)。达到 8 个通道的声音可以在所有平台上进行压缩,尽管并不是所有的平台都可以有效地播放它们。保存包的过程中将会进行所有必要的工作来将其转换为平台的本地格式。由于没有脚本化的扬声器映射,所以通道的编号预示了哪个通道在哪个扬声器上进行播放(参照以下表格)。

  扩展名 4.0 5.1 6.1 7.1  
FrontLeft _fl * * * *  
FrontRight _fr * * * *  
FrontCenter _fc   * * *  
LowFrequency _lf   * * *  
SideLeft _sl * * * *  
SideRight _sr * * * *  
|BackLeft | _bl | | | * | * |如果没有 BackRight 通道,这是 BackCenter 通道。
BackRight _br       *  

压缩设置修改为在所有平台上保持类似质量。当测试完很多声音后,我们的音乐制作人员确定了 40 XMA 的质量等同于 0.15 ogg vorbis 质量。

可视化编辑器工具


声效编辑器

您可以把音频文件的导入为 声音波形 ,然后在声效编辑器中对其应用称为 音频节点 的修改器。

声音质量预览器

如果您在通用浏览器中右击一个 SoundNodeWave 资源,并选择 Sound Quality Previewer(声音质量预览器) ,引擎将会在 5, 10, 15, 20, 15, 30, 35, 40, 50, 和 60 压缩设置下压缩声音。然后您可以点击任何特定的质量设置并在它被重新解压为 16 位 PCM 后听到声音。这可以用于选择最好的保真度 VS 内存设置。点击 确定 将会把当前的设置应用到波形上。

多通道导入/导出

通用浏览器中…

导出:

  • 从菜单中选择 Import(导出)
  • 选择文件 "Surround_fl.wav"、"Surround_fr.wav"、"Surround_sl.wav"、"Surround_sr.wav"。
  • 选择您想将其保存到的包并点击 OK to all(适用到所有)

这将会创建一个名称为 "Surround" 的四通道资源。

导出:

  • 从菜单中选择 Export(导出)
  • 选择保存文件的位置。

这将会使用扬声器的扩展名来保存原始的单声道文件。

策略


关于最大的潜在音量,可以使用一个更加全面的带宽。比如,立体声文件的 1.0 音量将比一个单声道文件 1.0 音量的大两倍,同样 (4) 单声道文件将比一个单声道文件的音量大 4 倍。但是最终您触及最大的阈值后,输出开始被剪切或者变形。

在任何给定的声效上,音量设置高达 ~2.0 之内时音频文件将会增大可感知的响度,任何高于它的值将不能在增加响度。一个单独的声效将永远不会变形,但是您不想使得您的所有文件都是最大音量,因为当在游戏中同时播放多个声效时,可能会超负荷。

您或许会想使用一致的音量设置机制,或者之上在设置音量时有个一般指导:

对话 ~1.4
音乐 ~0.75
武器 ~1.1
环境 ~0.5

另外,您可以考虑为使所有的音频在任何地方都是用单声道资源从而在所有平台保持一致性,但音乐除外。

优化声音的内存使用


当创建内容时,最好使用维持音频保真度的最低采样率。所有的平台都可以支持任何采样率。比如,对话通常在 22.1kHZ 可以维持声音较好的质量,而一般播放的音效(比如射击)则要具有较高的频率(比如 40.0kHz)。类似的启发可以应用到质量设置上。

以前,使用距离交叉衰减节点来对远处的声音应用一个低通滤波器(未经过任何处理的声音和经过低通滤波器后的同样版本的声音进行混合)。然而,现在所有的平台都支持低通滤波衰减,从而也意味着不再需要过滤后的版本。 version of the sound is no longer required.

测试地图


UTGame 有几个测试地图来验证音频系统的功能。

  • DM-SoundLoop - 用于测试无限循环和使用通知声音的循环。
  • DM-SoundReverb - 用于测试使用低通滤波器的混响和衰减。
  • DM-SoundMultichannel - 测试 5.1 播放。
  • DM-SoundMode - 测试声音模型。可用的测试模型是 loud(大)、quiet(静)、quick(快)、slow(慢)、 lowpass(低通滤波)、bandpass(带通滤波)、highpass(高通滤波)。
  • DM-SoundInterior - 测试环境区域功能。

动态载入


虚幻引擎音频系统不支持任意音频内容的同时载入,仅能动态载入包含音频的包。这种方法是有用的,因为我们想把尽可能多的带宽应用于贴图的动态载入;并且对于像虚幻竞技场和战争机器这样快动作的游戏来说有延迟也是不可接受的,而且此时同步 FaceFX 也变成了一个附加的令人厌烦的任务。作为可替换的方法,我们为战争机器创建了一个专门的对话系统

调试命令


  • ResetSoundState: 关闭任何以及所有调试命令。
  • TestLowPassFilter: 应用低通滤波器到所有的源。
  • IsolateDryAudio: 过滤掉混响声音,仅留下未被混响的声音。
  • IsolateReverb: 过滤掉未经过任何处理的声音,仅留下混响声音。
  • SetSoundMode x: 从声音组属性中应用音量和音调修改,并且从 UnAudioEffects.cpp 中定义的表格中应用一个 EQ 过滤器。
  • ListSounds, ListSoundDurations, ListAudioComponents: 列出当前加载的声音的详细信息。
  • ListWaves: 列出当前播放的声音的详细信息。

已知问题


  • TTP 60174: 当游戏窗口移动时,音频将会重新开始。
  • TTP 64605: -nosound 不会传递给 PIE。
  • TTP 80463: AmbientSoundSimple actor 不是总能在编辑器的实时预览重新启动。
  • TTP 92710: 使用 Delay Node 节点的 Sound Cues 不能在通用浏览器或者声效编辑器中进行正确地预览。
  • TTP 120345: AmbientSoundSimpleToggleable 的音量渐变功能被破坏。
  • TTP 122495: 如果把 Looping Node(循环节点)放置到 mixer(混合器)后并且同时也连接了非循环节点时,Looping Node(循环节点)不能正常工作。
  • TTP 122683: Distance Crossfade(距离交叉衰减)节点会不正确地重新触发播放 SoundNodeWave。

针对特定平台的音频系统