我有一个基于WebRTC的音频流应用程序,所以房间里有扬声器和听众。这些听众可以被移动成演讲者,也可以被移动成为听众。
现在,iOS 14在使用麦克风时有这个橙色指示器,它对听众和扬声器都启用,但应该只对扬声器启用。
我可以通过设置AVAudioSession类别来控制它,如果用户是扬声器,我会设置.playAndRecord,如果用户只是听众,我会设定.playout.
问题是,当听众升级为扬声器时,我需要该唱片类别,所以我尝试将类别从.replay更改为.playAndRecord,所有内容都会成功更改,但不起作用。
因此:
如果我以演讲者的身份加入流。playAndRecord效果很好。麦克风工作,有橙色指示灯。
如果我作为听众加入流,播放效果很好。麦克风不工作,也没有橙色指示灯。
如果我以听众的身份加入流,并升级到扬声器,麦克风不起作用,也没有橙色指示灯,但它应该起作用。
此外,如果我以演讲者的身份加入流,并被降级为听众,那就不起作用了。
我使用这种方法来配置它:
func configureAudioSession(clientMode: ClientMode) {
let audioConfiguration = RTCAudioSessionConfiguration()
audioConfiguration.category = clientMode == .listener ?
AVAudioSession.Category.playback.rawValue : AVAudioSession.Category.playAndRecord.rawValue
audioConfiguration.mode = clientMode == .listener ?
AVAudioSession.Mode.moviePlayback.rawValue : AVAudioSession.Mode.voiceChat.rawValue
audioConfiguration.categoryOptions = AVAudioSession.CategoryOptions(rawValue: AVAudioSession.CategoryOptions.mixWithOthers.rawValue)
self.rtcAudioSession.lockForConfiguration()
do {
try self.rtcAudioSession.setConfiguration(audioConfiguration, active: true)
} catch let error {
self.errorHandler.onNext(error)
}
self.rtcAudioSession.unlockForConfiguration()
}
rtcAudioSession只是:
let rtcAudioSession = RTCAudioSession.sharedInstance()
但它的背后是ofc iOS AVAudioSession对象。
使用
RTCAudioSessionConfiguration.setWebRTC(audioConfiguration)
代替
self.rtcAudioSession.setConfiguration
并删除
self.rtcAudioSession.lockForConfiguration()
self.rtcAudioSession.unlockForConfiguration()