Я не могу записать с помощью AVAudioEngine - PullRequest
0 голосов
/ 05 марта 2019

AVAudioSession.sharedInstance().setCategory(.playAndRecord, mode: .default)

Я могу записать, используя вышеуказанный код.Однако во время воспроизведения звук воспроизводят только динамики в верхней части iPhone.

Поэтому я хотел бы добавить defaultToSpeaker к опциям.

Однако при его добавлении запись не производится.

Есть ли решение?Пожалуйста, помогите мне.

Вот код, который я написал.

final class RecordEngine {
    private var engine: AVAudioEngine!
    private var mixer: AVAudioMixerNode!
    private var player: AVAudioPlayerNode!
    private var outputFile: AVAudioFile!

    let session = AVAudioSession.sharedInstance()

    init() {
        prepareAVAudioSession()
        prepareNodes()
        prepare()
    }

    func start() {
        try! engine.start()
    }

    func stop() {
        engine.pause()
        engine.reset()
    }

    private func prepareAVAudioSession() {
        do {
//            try session.setCategory(.playAndRecord, mode: .default, options: [.allowBluetooth, .allowBluetoothA2DP])
            try session.setCategory(.playAndRecord, mode: .default, options: .defaultToSpeaker)
            try session.setActive(true)
        } catch {

        }
    }

    private func prepareNodes() {
        engine = AVAudioEngine()
        mixer = AVAudioMixerNode()
        player = AVAudioPlayerNode()
        engine.attach(mixer)
        engine.attach(player)
    }

    private func prepare() {
        let input = engine.inputNode
        let mainMixer = engine.mainMixerNode

        let format = input.outputFormat(forBus: 0)
        engine.connect(player, to: mainMixer, format: format)
        engine.connect(input, to: mixer, format: format)
        engine.prepare()
    }

    func startRecord() {
        start()

        let format = mixer.outputFormat(forBus: 0)
        let outputFileURL = URL(string: NSTemporaryDirectory() + "temp.caf")!

        do {
            outputFile = try AVAudioFile(forWriting: outputFileURL, settings: format.settings)
        } catch {
            print(error)
        }

        mixer.installTap(onBus: 0, bufferSize: 1024, format: format) { [weak self] buffer, when in
            do {
                try self?.outputFile.write(from: buffer)
                print(buffer)
            } catch {
                print(error)
            }
        }
    }

    func stopRecord() {
        mixer.removeTap(onBus: 0)
        print(outputFile)
        stop()
    }

    func startPlaying() {
        start()

        player.scheduleFile(outputFile, at: nil) {
            print("complete")
        }

        player.play()
    }

    func pausePlaying() {
        player.pause()
    }
}

1 Ответ

0 голосов
/ 07 марта 2019

Проблема не в defaultToSpeaker, а в настройке микшера.У вас есть mixer (на который вы устанавливаете кран) без вывода, а также mainMixerNode.Вам нужны оба смесителя?Если это так, вы можете подключить mixer к mainMixer:

engine.connect(mixer, to: mainMixer, format: format)

или удалить mixer и использовать mainMixer везде, или какой-либо третий вариант, который не дает обратной связи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...