我有一个使用WebRTC进行语音聊天的应用。
经过大量的故障排除后,我得出的结论是,每当我收到流时,WebRTC都会将AVAudioSession共享实例设置为以下内容:
try AVAudioSession.sharedInstance().setCategory(.playAndRecord, mode: .voiceChat, options: .allowBluetooth)
我想播放一个音频文件(大约一秒钟),如果我只是加载并执行player.play()
,它将无法播放。如果我尝试将类别设置为.playback
或对音频文件有意义的任何设置,则流的音频将停止播放。
我还尝试创建一个新的AVAudioSession实例,但是一旦播放了音频文件,流的音频就会停止。
我是否可以在不影响流的音频及其配置的情况下播放音频文件?
这是完整的代码
private func playTapSound() {
guard let url = Bundle.main.url(forResource: App.AudioFile.emojiTapSound, withExtension: "mp3") else { return }
do {
let audioSesson = AVAudioSession()
try audioSesson.setCategory(.playback, mode: .default)
try audioSesson.setActive(true)
audioPlayer = try AVAudioPlayer(contentsOf: url, fileTypeHint: AVFileType.mp3.rawValue)
guard let player = audioPlayer else { return }
player.play()
} catch let error {
LogManager.shared.print("Error - playing emoji tap audio -", error.localizedDescription, type: [.Error, .Audio])
}
// var chime1URL: NSURL?
// var chime1ID: SystemSoundID = 0
// let filePath = Bundle.main.path(forResource: "emojiTapSound", ofType: "wav")
// chime1URL = NSURL(fileURLWithPath: filePath!)
// AudioServicesCreateSystemSoundID(chime1URL!, &chime1ID)
// AudioServicesPlaySystemSound(0)
}
我也尝试使用AudioToolBox,但由于某些原因,它只能在模拟器上播放。我尝试了Apple的一种预装声音,验证了这不是我手机的设置,并且可以正常工作。