簡體   English   中英

我無法使用AVAudioEngine錄制

[英]I can't record using AVAudioEngine

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()
    }
}

問題不是defaultToSpeaker ,而是混音器設置。 您有一個mixer (安裝了水龍頭),沒有輸出,還有mainMixerNode 您需要兩個攪拌機嗎? 如果是這樣,您可以將mixer連接到mainMixer

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

或刪除mixer並在各處使用mainMixer ,或某些不會產生反饋的第三種選擇。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM