将AVAudioSession类别从"播放"更改为"播放和录制"



我有一个基于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()

最新更新