我正在尝试混合音频源,以便没有音频闪避。我试图解决的用例是在后台进行音频通话,同时播放音乐和/或收听应用程序音频,没有任何音频闪避。音频闪避是指音频降低并略微失真以帮助收听另一个音频会话。我可以拥有未躲避的音频和音频混合(或 iOS(吗?
我尝试了以下代码。我也尝试过将其包装在DispatchQueue.main.async闭包中,但仍然没有运气。
// I have also tried this code with this block uncommented
// do {
// try audioSession.setActive(false, options: .notifyOthersOnDeactivation)
//
// } catch let activationError {
// print(activationError)
// print(activationError.localizedDescription)
// }
let audioSession = AVAudioSession.sharedInstance()
do {
try audioSession.setCategory(
AVAudioSession.Category.playAndRecord,
mode: AVAudioSession.Mode.voiceChat,
options: [.allowBluetoothA2DP, .allowBluetooth, .mixWithOthers, .allowAirPlay]
)
} catch let setCategoryError {
print(setCategoryError)
print(setCategoryError.localizedDescription)
}
do {
try audioSession.setActive(true, options: .notifyOthersOnDeactivation)
} catch let activationError {
print(activationError)
print(activationError.localizedDescription)
}
答案似乎是AVAudioSession.Mode
会自动在引擎盖下设置一些选项。苹果似乎已经做出了设计决定,即.voiceChat
模式应该始终避开其他模式以获得最佳体验。在.videoChat
模式下也是如此,这两种模式都是用于 Agora 调用的明显模式。使用这些模式似乎会自动设置.duckOthers
标志。
我能够通过将模式设置为.videoRecording
来解决此问题,该模式专为录制音频和视频的应用程序而设计,因此不会自动设置.duckOthers
.因为这实际上不是您正在做的事情,所以它绝对是一种解决方法,并且可能会产生其他副作用。
鉴于你对AVAudioSession的处理方式,你可能还想阻止Agora从你下面改变它。您可以调用agoraKit.setAudioSessionOperationRestriction(.all)
来防止 Agora 在未经您许可的情况下更改全局 AVAudiosession,这可能是完成这项工作所必需的。