Запись и воспроизведение с использованием наушников mi c и встроенного динамика Bluetooth - PullRequest
3 голосов
/ 31 марта 2020

У меня в настоящее время есть пара наушников Bluetooth. Из этого поста у меня есть код, необходимый для извлечения звука с микрофона наушников Bluetooth, а затем воспроизведения звука через наушники Bluetooth. Однако я хочу изменить код так, чтобы я мог извлечь звук из микрофона наушников Bluetooth, а затем воспроизвести звук через ВНУТРЕННИЙ динамик телефона / через любую другую пару наушников, которые могут быть физически подключены к телефону. Как бы я go сделал это? Это мой текущий код:

import UIKit
import AVFoundation

class PlayRecordVC: UIViewController, AVAudioRecorderDelegate {

    let audioSession = AVAudioSession.sharedInstance()
    let player = AVAudioPlayerNode()
    let engine = AVAudioEngine()

    override func viewDidLoad() {
        super.viewDidLoad()

        do{
            try audioSession.setCategory(.playAndRecord, mode: .default, options: [.allowBluetooth])
            try audioSession.overrideOutputAudioPort(.speaker)
            try audioSession.setActive(true)
        } catch{
            print(error.localizedDescription)
        }
        let input = engine.inputNode

        engine.attach(player)

        let bus = 0
        let inputFormat = input.inputFormat(forBus: bus)

        engine.connect(player, to: engine.mainMixerNode, format: inputFormat)

        input.installTap(onBus: bus, bufferSize: 512, format: inputFormat) { (buffer, time) -> Void in
            self.player.scheduleBuffer(buffer)
            print(buffer)
        }
    }

    @IBAction func start(_ sender: UIButton) {
        try! engine.start()
        player.play()
    }

    @IBAction func stop(_ sender: UIButton) {
        engine.stop()
        player.stop()
    }

}

ОБНОВЛЕНИЕ:

Когда я добавляю строку audioSession.overrideOutputAudioPort(.speaker), звук не воспроизводится вообще (ни из наушников Bluetooth, ни из внутреннего динамика телефона)

Ответы [ 2 ]

1 голос
/ 07 апреля 2020
let audioSession = AVAudioSession.sharedInstance()
do {

    try audioSession.setCategory(AVAudioSessionCategoryPlayAndRecord, with: .allowBluetooth)
    try audioSession.setMode(AVAudioSessionModeDefault)
    try audioSession.setActive(true)
} catch {
print(error)
}

нужно определить правильный режим я считаю. Не совсем уверен, какой режим будет работать лучше в вашем случае. https://developer.apple.com/documentation/avfoundation/avaudiosession/mode

Эта ссылка ниже имеет расширение для проверки, подключен ли микрофон. { ссылка }

1 голос
/ 02 апреля 2020

Я не проверял, действительно ли это заставляет микрофон по-прежнему использоваться наушниками, но по умолчанию для направления звука на динамики вместо наушников это должно работать:

try! audioSession.overrideOutputAudioPort(.speaker)  

Вот документация метода.

Существует также опция этой категории , которую вы могли бы дать аудио сеансу, чтобы тот же эффект имел место, но также избегал его сброса с помощью жесты (например, присоединение новых наушников).

Если после вашего теста вы обнаружите, что это фактически перемещает запись также для использования внутреннего микрофона, я думаю, что нет другого пути (по крайней мере, другого способа, который я нашел в ).

...