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原生层修复(无瞬断,体验最优)
通过自定义原生插件在录音结束后手动指定音频会话类别,完全规避状态切换异常,适合对音频体验要求高的项目:
- 在项目
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]; }
- 在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
相关产品推荐
相关产品推荐

