You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity+Wwise iOS构建锁屏后屏幕变暗时声音停止问题求助

解决方案:Unity+Wwise实现iOS锁屏黑屏持续播放音频

1. 修正音频会话配置(核心步骤)

你之前在UnityAppController.mm的配置存在遗漏,需确保在正确时机完成完整的音频会话配置,并处理会话中断:

  • 打开UnityAppController.mm,在application:didFinishLaunchingWithOptions:方法内添加以下代码(保留原有业务代码):
#import <AVFoundation/AVFoundation.h>

- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions
{
    // 原有代码保留
    AVAudioSession *audioSession = [AVAudioSession sharedInstance];
    NSError *sessionError = nil;
    // 配置Playback类别,允许后台播放、蓝牙音频并支持混音
    [audioSession setCategory:AVAudioSessionCategoryPlayback
                     withOptions:AVAudioSessionCategoryOptionMixWithOthers | AVAudioSessionCategoryOptionAllowBluetooth
                           error:&sessionError];
    if (sessionError) {
        NSLog(@"Audio Session Category Error: %@", sessionError.localizedDescription);
    }
    // 激活会话,中断时通知其他应用
    [audioSession setActive:YES withOptions:AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation error:&sessionError];
    if (sessionError) {
        NSLog(@"Audio Session Activation Error: %@", sessionError.localizedDescription);
    }
    // 开启远程控制事件(无需控制可删除,但不影响功能)
    [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
    
    return [super application:application didFinishLaunchingWithOptions:launchOptions];
}
  • 添加会话中断处理逻辑,防止锁屏时音频会话被系统挂起:
- (void)application:(UIApplication *)application didChangeAudioSessionInterruptionType:(AVAudioSessionInterruptionType)interruptionType
{
    if (interruptionType == AVAudioSessionInterruptionTypeEnded) {
        // 中断结束后重新激活音频会话
        NSError *error = nil;
        [[AVAudioSession sharedInstance] setActive:YES error:&error];
        if (error) {
            NSLog(@"Reactivate Audio Session Error: %@", error.localizedDescription);
        }
        // 同步唤醒Wwise引擎
        AkSoundEngine::WakeupFromSuspend();
    }
}

2. 修正Wwise后台配置

  • 打开Wwise工程的Platform Settings -> iOS面板,确认Background Audio已勾选,且Audio Session Category设置为Playback(不要使用默认的Ambient)。
  • 在Wwise的Init Settings中,将Maximum Voice Count设置为大于当前使用的音轨数(例如设为10),避免误触发Voice Starvation告警。

3. 优化Unity侧Wwise唤醒逻辑

替换你之前的Update循环调用逻辑,改用应用状态回调触发唤醒,减少性能消耗:

using UnityEngine;
using AkSoundEngine;

public class AudioBackgroundHandler : MonoBehaviour
{
    void Awake()
    {
        // 开启Wwise后台音频开关
        AkSoundEngine.SetGlobalSwitch("iOS_Background_Audio", "On");
        // 注册应用前后台状态回调
        Application.willResignActive += OnAppEnterBackground;
        Application.didBecomeActive += OnAppEnterForeground;
    }

    void OnAppEnterBackground()
    {
        // 应用锁屏进入后台时,强制唤醒Wwise并触发音频渲染
        AkSoundEngine.WakeupFromSuspend();
        AkSoundEngine.RenderAudio();
    }

    void OnAppEnterForeground()
    {
        // 应用回到前台时重置引擎状态
        AkSoundEngine.WakeupFromSuspend();
    }

    void OnDestroy()
    {
        // 销毁时解绑回调
        Application.willResignActive -= OnAppEnterBackground;
        Application.didBecomeActive -= OnAppEnterForeground;
    }
}

4. 检查iOS项目Capabilities配置

  • 在Xcode中打开项目,进入Signing & Capabilities面板,添加Background Modes并勾选Audio, AirPlay, and Picture in Picture。
  • 确认Info.plist中存在UIBackgroundModes数组并包含audio项(Xcode未自动生成则手动添加):
<key>UIBackgroundModes</key>
<array>
    <string>audio</string>
</array>

关于AK Error: Voice Starvation的说明

该告警并非一定是资源不足,当Wwise引擎被系统挂起后,音频线程无法正常调度,会误判为资源不足导致轨道分配失败。完成上述配置后,引擎持续运行,该告警会自动消失。


内容的提问来源于stack exchange,提问作者Ando

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 17:53:09