版本
Wwise SDK 2022.1.12
|
iOS SDK 依靠 Apple 音频会话 API 来遵守应用内和应用间的操作系统音频处理机制。音频会话的主要目标是,当不同系统事件或用户操作发生时,为音频应用程序提供规范行为。换言之,音频会话是音频应用程序与 iOS 操作系统之间的中间层,提供了可预测的音频行为。
应用程序针对系统和其他应用程序的音频行为通过一系列音频会话类别和子类别(被称为类别选项)来控制。使用音频或用于制作音频的每款 iOS 应用程序都应自行注册到系统中的特定音频会话类别和类别选项集合(可选),以表明它的预期音频行为。
音频会话还用于处理和响应 iOS 系统中断和音频通道变换。
最后,音频会话还是 iOS 底层硬件音频组件在不同音频应用程序和系统声音之间的共享机制。因此必须满足音频会话需求,防止系统事件处理不当导致应用程序崩溃或音频丢失。
每当音频应用程序需要捕获或者产生音频时,它必须请求并在系统上激活音频会话。例如,当音乐应用程序用户按“播放”按钮时,应用程序应在按钮被按下后请求激活它的音频会话,并在用户按下“暂停”按钮时停用该功能。许多 iOS 内置应用程序使用音频会话来输出或采集音频,这可能会对用户应用程序音频行为产生影响:
iOS 可以随时停用应用程序的音频会话来响应各种其他音频事件,例如手机来电、定时器设定的音频报警或者日历事件。这些事件被称为 interruption(中断)
,音频应用程序可以对此类音频会话优先级变更作出反应,并在中断结束后正确恢复播放或录音。应用程序切换、按下主页按钮后在后台运行应用程序以及锁定和解锁设备时,也会激活和停用音频会话。以下各节详细介绍 Wwise 如何管理这些事件,以及客户端应用程序须采取何种措施来确保音频正确播放。
iOS 上运行的所有音频应用程序都必须使用音频会话来处理、获取或输出声音。由于所有音频应用程序使用音频不一定为了同一目标或目的(音频录制应用程序可能需要获取音频在后台执行,而游戏会在另一音频程序启动时完全暂停),iOS 定义了几种音频会话类别,对用户操作或系统事件发生时的预期音频行为进行分组。每款音频应用程序必须自行注册使用给定类别,然后才能在设备上处理音频。
各类的不同音频行为主要包括:
每款音频应用程序仅隶属于一种类别。如果没有具体选定具体类别,则会使用默认的AVAudioSessionCategorySoloAmbient
类别。iOS Wwise SDK 中提供四个主要类别:
AkAudioSessionCategoryAmbient
:相当于 iOS 音频会话 AVAudioSessionCategoryAmbient
类别Ambient
类别中的所有应用程序音频将与其他应用程序的音频混音。最常见的情形是用户启动 Music 应用程序并开始播放音乐,然后切回到您的应用程序。Ambient
不支持从您的应用程序在后台播放音频。如果用户从您的应用程序切换到另一音频应用程序,即使其他应用程序使用 mixable(可混音)类别,您的应用程序音频也将静音。AkAudioSessionCategorySoloAmbient
:相当于 iOS 音频会话 AVAudioSessionCategorySoloAmbient 类别Ambient
类别的主要区别在于,当其音频会话激活时,其他应用程序的音频会中断。AkAudioSessionCategoryPlayAndRecord
:相当于 iOS 音频会话 AVAudioSessionCategoryPlayAndRecord 类别AkAudioSessionCategoryOptionMixWithOthers
选项(详见下文),并且其他应用程序的音频(如来自 Music 应用程序的音乐)在播放时不会与应用程序音频一起混音。AkAudioSessionCategoryOptionMixWithOthers
(见下文),则当另一音频应用程序在后台激活其音频会话时,应用程序音频将不与其他源混音。例如,使用 Music 应用程序听音乐的用户切回到您的应用程序时,它们的音乐将与您的应用程序音频混合。然而与 AkAudioSessionCategoryAmbient
一样,使用此选项仍然不会输出来自在 Wwise 中设为静音的应用程序 BGM(请参见 处理用户音乐(BGM)和DVR 了解详情)。AkAudioSessionCategoryPlayback
:相当于 iOS 音频会话 AVAudioSessionCategoryPlayback 类别。AkAudioSessionCategoryOptionMixWithOthers
选项(详见下文),并且其他应用程序的音频(如来自 Music 应用程序的音乐)在播放时不会与应用程序音频一起混音。除了上面所列的音频会话类别外,使用类别选项还可以不沿用某些类别的默认行为。
音频会话类别选项可以配有 enum AkAudioSessionCategoryOptions
:
AkAudioSessionCategoryOptionMixWithOthers
:相当于 iOS 音频会话 AVAudioSessionCategoryOptionMixWithOthers
类别选项AkAudioSessionCategoryPlayAndRecord
和 AkAudioSessionCategoryPlayback
类别结合使用。AkAudioSessionCategoryOptionDuckOthers
:相当于 iOS 音频会话 AVAudioSessionCategoryOptionDuckOthers
类别选项AkAudioSessionCategoryPlayAndRecord
和 AkAudioSessionCategoryPlayback
类别结合使用。AkAudioSessionCategoryOptionAllowBluetooth
:相当于 iOS 音频会话 AVAudioSessionCategoryOptionAllowBluetooth
类别选项AkAudioSessionCategoryPlayAndRecord
类别使用。AkAudioSessionCategoryOptionAllowBluetoothA2DP
:相当于 iOS 音频会话 AVAudioSessionCategoryOptionAllowBluetoothA2DP
类别选项。AkAudioSessionCategoryPlayAndRecord
类别使用。AkAudioSessionCategoryOptionDefaultToSpeaker
: 相当于 iOS 音频会话 AVAudioSessionCategoryOptionDefaultToSpeaker
类别选项AkAudioSessionCategoryPlayAndRecord
类别使用。在 iOS 设备上,当您的应用程序正在使用其音频设备时,可能发生一定数量的用户操作或系统事件。例如,呼入电话、用户从您的应用程序切换到另一个应用程序、定时器声音提醒响起、用户将耳机插入/拔出插孔或者用户按下 Ring/Silent 开关,都是对您应用程序的音频行为可能产生影响的事件。本节介绍 iOS 中应对此类事件的不同机制,以及如何通过 Wwise 与您的应用程序通信。
iOS 中存在三种主要音频事件:前台/后台过渡、中断和通路变换。
在应用程序被操作系统转至后台时,声音引擎的行为取决于 Audio Session 类别。
在 Ambient 和 Solo Ambient 类别中,音频会话会被停用。因此,声音引擎将暂停工作。这时,既不会处理音频,也不会调用 API。这样可以节约 Apple 设备电量。游戏也会暂停处理,避免调用 AK::SoundEngine
。在应用程序返回前台后,声音引擎将恢复工作,并处理队列中的 API 调用。系统会自动执行所有这些操作。
在 PlayAndRecord 和 Playback 类别中,转到后台时不会中断音频。这时会继续处理音频并照常调用 API。您可以通过在平台初始化设置的 eAudioSessionBehavior 参数中设置 AkAudioSessionBehaviorSuspendInBackground 标记来更改此行为。若设置此标记,在应用程序转到后台时,声音引擎本身会暂停工作(跟上述 Ambient 和 Solo Ambient 类别一样)。
不同的系统事件或用户操作可能会导致应用程序的音频会话被停用,即便此时应用程序在前台运行。这种情况被称为音频会话中断。比如,在收到呼入电话或 Siri 被激活时就会发生此类中断。
无论选择哪个音频会话类别,在中断期间声音引擎都会自动暂停音频渲染。不过,仍会处理 API 调用。所以,此类别相当于全局静音。在中断结束后,会自动恢复音频渲染。
若应用程序必须知晓这些中断事件,而游戏引擎并未予以告知,则可在 AkPlatformInitSettings.audioCallbacks.interruptionCallback
中设置回调函数。否则,声音引擎将无从处理这些事件。
当收到这些中断时,Wwise 负责暂停/恢复声音引擎组件,用户无需采取进一步的行动来确保正确地激活/停用音频会话。在音频会话中断或恢复(比如要更新 UI 元素或提供有关中断的视觉反馈)时,若 SDK 客户端应用程序中需要进行特别处理,则须将代码添加到上述应用程序回调。
注意: 由于“开始”音频中断回调在内部暂停声音引擎之前调用,因此它不能用于播放任何类型的音频,甚至短暂声音,因为无法保证达到预期的结果。 |
注意: 用户音频中断调用只用于执行简单的任务,例如 UI 或对象属性更新,而决不可用于执行 CPU 密集型计算或者耗时的操作。否则下无法保证达到预期的结果。 |
音频通路是音频通过设备中不同音频硬件组件的指定路径。例如当用户插入或拔出耳机时,音频通路将变换,因为声音输出应发送到耳机或被暂停而不是通过设备扬声器传出。iOS 可以将通路变换情况通知给注册了 AVAudioSessionRouteChangeNotification
的应用程序。
发生基本的通路变换(例如插入/拔出耳机)时,Apple 音频会话自动负责激活/停用正在运行的应用程序的音频会话。Wwise SDK 不提供上述中断情形以外的回调机制。如果用户需要检测此类通路变换来让应用程序中的特定元素做出反应,请参阅“Integration Demo”来了解如何轻松实现。