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

Unity iOS端调用Microphone.End()导致游戏音频全部静音问题

Unity iOS 调用麦克风停止后全局静音问题修复

问题根因

该问题是iOS系统AVAudioSession音频会话状态切换异常导致,和WAV音频保存逻辑无关:

  • 游戏启动时Unity默认使用AVAudioSessionCategorySoloAmbient会话类别,Unity引擎内部做了兼容,即便设备开启静音模式,游戏BGM、音效也可正常播放。
  • 调用Microphone.Start()开启录音时,Unity会自动将音频会话切换为AVAudioSessionCategoryPlayAndRecord类别适配录音需求;但调用Microphone.End()停止录音时,Unity不会主动将会话切回原状态,而是直接沿用录音会话的默认规则——此时系统会重新遵循静音键限制,若设备处于静音模式,所有音频输出会被直接拦截,直到手动拨动静音键触发会话状态刷新才会恢复。

修复方案

方案1:Unity层快速修复(无需原生代码)

适合快速迭代上线的版本,仅需在停止录音逻辑末尾增加音频配置重置代码,强制Unity刷新音频会话状态即可,Unity 2020及以上版本均支持:

public void StopRecordingAudio()
{
    string audioDir = Path.Combine(Application.persistentDataPath, "Audio");
    if (!Directory.Exists(audioDir))
    {
        Directory.CreateDirectory(audioDir);
    }
    string tempPath = Path.Combine(audioDir, "audio_clip.wav");
    
    Microphone.End(null);
    SaveWav.Save(tempPath, recordedClip);

    // 新增以下代码重置音频配置
    AudioConfiguration currentConfig = AudioSettings.GetConfiguration();
    AudioSettings.Reset(currentConfig);
}

注意:该方案会造成约100ms以内的音频瞬断,对普通游戏体验影响极小。

方案2:iOS原生层修复(无瞬断,体验最优)

通过自定义原生插件在录音结束后手动指定音频会话类别,完全规避状态切换异常,适合对音频体验要求高的项目:

  1. 在项目Assets/Plugins/iOS路径下新建AudioSessionFix.mm文件,写入以下原生代码:
#import <AVFoundation/AVFoundation.h>

extern "C" void RestoreGameAudioSession()
{
    AVAudioSession *session = [AVAudioSession sharedInstance];
    // 切换回游戏播放场景的会话类别,忽略静音键限制
    [session setCategory:AVAudioSessionCategoryPlayback
             withOptions:AVAudioSessionCategoryOptionMixWithOthers
                   error:nil];
    [session setActive:YES withOptions:AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation error:nil];
}
  1. 在Unity录音逻辑中增加原生方法调用,停止录音后主动触发会话恢复:
using System.Runtime.InteropServices;
using System.IO;
using UnityEngine;

public class AudioRecorder : MonoBehaviour
{
    private AudioClip recordedClip;
    
    [DllImport("__Internal")]
    private static extern void RestoreGameAudioSession();

    public void RecordAudio()
    {
        recordedClip = Microphone.Start(null, false, 20, 44100);
    }

    public void StopRecordingAudio()
    {
        string audioDir = Path.Combine(Application.persistentDataPath, "Audio");
        if (!Directory.Exists(audioDir))
        {
            Directory.CreateDirectory(audioDir);
        }
        string tempPath = Path.Combine(audioDir, "audio_clip.wav");
        
        Microphone.End(null);
        SaveWav.Save(tempPath, recordedClip);

        // iOS平台执行会话恢复
        #if UNITY_IOS && !UNITY_EDITOR
        RestoreGameAudioSession();
        #endif
    }
}

排查避坑提示

  • 无需在WAV保存逻辑中排查问题,该异常和第三方保存实现完全无关
  • 该问题不止在初始开启静音的设备上复现:游戏运行过程中开启静音,再执行一次开始/停止录音操作同样会触发,测试时需要覆盖该场景
  • 若修复后出现录音结束后音频从听筒播放、音量变小的问题,可在原生会话设置代码中增加音频路由重设逻辑,强制输出到扬声器即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 01:21:47