我无法使用 AVAudioEngine 录制

Posted

技术标签:

【中文标题】我无法使用 AVAudioEngine 录制【英文标题】:I can't record using AVAudioEngine 【发布时间】:2019-03-05 09:12:42 【问题描述】:

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】:

问题不在于defaultToSpeaker,而在于混音器设置。你有一个没有输出的mixer(你安装了一个水龙头)和mainMixerNode。 你需要两个混音器吗?如果是这样,您可以将mixer 连接到mainMixer

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

或删除mixer 并在任何地方使用mainMixer,或某些不会产生反馈的第三个选项。

【讨论】:

将混音器连接到 mainMixer 时会发出啸叫声。

以上是关于我无法使用 AVAudioEngine 录制的主要内容,如果未能解决你的问题,请参考以下文章

在 WatchOS 上使用 AVAudioEngine 录制时阻止播放

使用 AVAudioEngine 进行语音识别会在录制后阻止声音

AvaudioEngine - 以特定采样率录制语音 AvaudioEngine for Analysis

如何使用 8000 PCM 格式的 AVAudioEngine 录制和播放?

AVAudioEngine 录制在 AVAudioPlayerNode 中播放的声音

在 Objective-C 中为 AVAudioEngine 设置录制格式