iOS设置AVAudioSession为.record报错-50,改用.playAndRecord是否正常?
问题:AVAudioSession设置
.record类别报错,改用.playAndRecord正常是否正常? 相关代码
do { // Activate the session. audioSession = AVAudioSession.sharedInstance() guard let audioSession = audioSession else { return } try audioSession.setActive(false) try audioSession.setCategory(.playAndRecord, mode: .spokenAudio) //forced try audioSession.setActive(true, options: .notifyOthersOnDeactivation) // Start the processing pipeline. try audioEngine.start() Task { @MainActor in isRecording.wrappedValue = true } } catch { handleError(withMessage: error.localizedDescription) }
报错信息
AVAudioSession_iOS.mm:2382 Failed to set category, error: -50
解答
错误码-50对应无效参数或配置冲突,你遇到的这个现象是正常的,核心原因和AVAudioEngine的工作机制、iOS音频会话规则有关:
AVAudioEngine的底层需求:
哪怕你只做录制,AVAudioEngine作为音频处理管线,启动时需要同时访问音频输入和输出的底层资源——.record类别仅允许输入,会限制输出相关资源的访问,和AVAudioEngine的运行条件冲突,导致设置失败。设备/系统兼容性:
部分iOS设备(比如蓝牙音频设备)的硬件要求音频会话同时支持输入输出才能启动录制;或者当前系统有其他音频会话占用资源,.record的排他性更强,容易触发冲突,而.playAndRecord的兼容性更广泛。
你改用.playAndRecord是完全合理的方案,甚至在使用AVAudioEngine做录制时,这是更稳妥的选择。如果想优化,可以根据需求给.playAndRecord添加options参数(比如.duckOthers让其他音频降音,.mixWithOthers允许混音),同时确保已经正确获取麦克风权限,避免权限层面的潜在问题。
内容的提问来源于stack exchange,提问作者erotsppa
相关产品推荐
相关产品推荐

