React Native WebRTC设置AVAudioSessionCategoryPlayback遇-50错误
解决iOS上WebRTC切换至AVAudioSessionCategoryPlayback时的NSOSStatusErrorDomain Code=-50错误
错误原因解析
Error Code -50属于参数无效错误,问题出在你复用了WebRTC默认配置的mode。WebRTC的webRTCConfiguration默认使用AVAudioSessionModeVoiceChat,这个模式专为**语音通话(依赖麦克风)**设计,和AVAudioSessionCategoryPlayback(纯播放场景)不兼容,导致配置设置失败。
修正方案
1. 调整音频会话配置
放弃复用WebRTC默认配置对象,直接针对纯播放场景设置匹配的category和mode:
@try { NSError *error = nil; RTCAudioSession* session = [RTCAudioSession sharedInstance]; [session lockForConfiguration]; // 设置纯播放分类,默认使用扬声器输出 BOOL categorySuccess = [session setCategory:AVAudioSessionCategoryPlayback withOptions:AVAudioSessionCategoryOptionDefaultToSpeaker error:&error]; if (error) { NSLog(@"LMT Error setCategory: %@", error); } else { NSLog(@"LMT Audio session setCategory successfully."); } // 使用媒体播放对应的模式,替代默认的VoiceChat BOOL modeSuccess = [session setMode:AVAudioSessionModeMoviePlayback error:&error]; if (error) { NSLog(@"LMT Error setMode: %@", error); } else { NSLog(@"LMT Audio session setMode successfully."); } // 激活音频会话,确保配置生效 [session activateWithOptions:AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation error:&error]; if (error) { NSLog(@"LMT Error activate session: %@", error); } [session unlockForConfiguration]; } @catch (NSException *exception) { NSLog(@"LMT Error: %@", exception); }
2. 确保WebRTC仅接收音频流
作为直播观看场景,不需要发送本地音频,初始化WebRTC时不要创建并添加本地音频轨道:
- 在React Native层,创建PeerConnection后仅添加远程音频轨道,避免调用
createLocalAudioTrack相关方法,这样既不会触发麦克风权限请求,也能让WebRTC内部不再强制依赖麦克风相关的音频配置。
3. 额外注意事项
- 检查项目中是否有其他模块(如独立音频播放器、语音识别工具)修改音频会话,避免配置冲突;
- 纯播放场景下,可移除
Info.plist中的NSMicrophoneUsageDescription声明,避免用户产生权限困惑; - 测试低版本iOS(如iOS 12)的兼容性,旧系统对音频会话的配置规则更严格。
内容的提问来源于stack exchange,提问作者Minh Tiến
相关产品推荐
相关产品推荐

