iOS - Воспроизведение аудио файла во время воспроизведения видео / аудио WebRTC - PullRequest
0 голосов
/ 10 февраля 2019

Я успешно реализовал WebRTC в своем приложении, однако у меня возникла проблема, из-за которой звук выводился из ресивера, а не из ресивера + динамика.Я закончил тем, что изменил решение, которое нашел для обработки аудио маршрутизации при подключении и отключении Bluetooth-гарнитур или обычных гарнитур.Уведомление обычно срабатывает, как только я получаю звук через библиотеку WebRTC.

NotificationCenter.default.addObserver(forName: AVAudioSession.routeChangeNotification, object: nil, queue: nil, using: routeChange)


  func routeChange(_ n: Notification) {
    guard let info = n.userInfo,
        let value = info[AVAudioSessionRouteChangeReasonKey] as? UInt,
        let reason = AVAudioSession.RouteChangeReason(rawValue: value) else { return }
    switch reason {
    case .categoryChange:
        for description in AVAudioSession.sharedInstance().currentRoute.outputs {
            if description.portType == AVAudioSession.Port.builtInSpeaker || description.portType == AVAudioSession.Port.builtInReceiver {
                try? AVAudioSession.sharedInstance().overrideOutputAudioPort(.speaker)
            }
        }
    case .oldDeviceUnavailable:
        try? AVAudioSession.sharedInstance().overrideOutputAudioPort(.speaker)
    default:
        return
    }
}

Однако это решение не позволило мне воспроизвести аудиофайл, который я использую в качестве сигнала / обратной связи, когда пользователь нажимает кнопку в моемприложение.По сути, следующий код будет воспроизводить аудиофайл, но он испортит конфигурацию, указанную выше, различными способами.В первую очередь звук будет выводиться из ресивера, а не из динамика и ресивера.Я считаю, что это также испортилось с гарнитурами.

private func playTapSound() {
    guard let url = Bundle.main.url(forResource: App.AudioFile.tapFeedback, withExtension: "mp3") else { return }

do {
    try AVAudioSession.sharedInstance().setCategory(.playback, mode: .default)
    try AVAudioSession.sharedInstance().setActive(true)

    audioPlayer = try AVAudioPlayer(contentsOf: url, fileTypeHint: AVFileType.mp3.rawValue)

    guard let player = audioPlayer else { return }

    player.play()

} catch let error {
    print("### Error - playing tap audio -", error.localizedDescription)
}
}

Мне нужно воспроизвести аудиофайл, не затрагивая метод routeChange.

...