首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将缓冲区从AVAudioNodeTap写入AVAudioFile (从AVAudioEngine保存录音)

将缓冲区从AVAudioNodeTap写入AVAudioFile (从AVAudioEngine保存录音)
EN

Stack Overflow用户
提问于 2020-09-25 06:40:32
回答 1查看 163关注 0票数 1

我正在使用AVAudioEngine监控麦克风输入。在AudioEngine停止后,我想将接收到的音频保存到AVAudioFile中以备将来使用。

这是我当前的实现,并且该文件包含数据。它是一个wav文件,但它不是一个可播放的音频文件。我在想,我的格式可能有问题,这是我的方法。

代码语言:javascript
复制
    private enum Setting {
        static let formatID = Int(kAudioFormatLinearPCM)
        static let sampleRate = 16000
        static let numberOfChannels = 1
        static let encoderQuality = AVAudioQuality.min.rawValue
    }

    private let settings: [String: Any] =
        [AVFormatIDKey: Setting.formatID,
         AVSampleRateKey: Setting.sampleRate,
         AVLinearPCMIsFloatKey: true,
         AVNumberOfChannelsKey: Setting.numberOfChannels,
         AVEncoderAudioQualityKey: Setting.encoderQuality]


    func record() {
        let mixer = AVAudioMixerNode()
        audioEngine.attach(mixer)
        let format = AVAudioFormat(settings: settings)
        audioEngine.connect(audioEngine.inputNode, to: mixer, format: audioEngine.inputNode.inputFormat(forBus: 0))
        audioEngine.connect(mixer, to: audioEngine.outputNode, format: format)
        
    guard let destinationURL = FileManager.default.whs_generateWAVFile() else { return }
        do {
            file = try AVAudioFile(forWriting: destinationURL, settings: mixer.outputFormat(forBus: 0).settings, commonFormat: .pcmFormatFloat32, interleaved: true)
            mixer.installTap(onBus: 0, bufferSize: 1024, format: mixer.outputFormat(forBus: 0)) { (buffer, time) in
                do { try self.file?.write(from: buffer); print("Wrote \(buffer)") } catch { print("Error: \(error)") }
            }
            audioEngine.prepare()
            do { try audioEngine.start() } catch { print("Big error:  \(RecordingError.audioEngineStart.description)"); return }
        } catch {
            print("Big Error:  \(RecordingError.audioEngineStart.description), \(error)")
        }
    }
EN

回答 1

Stack Overflow用户

发布于 2021-02-10 17:06:29

这是因为您尚未关闭要录制到的AVAudioFile。停止引擎时,将file设置为nil,wav文件将可播放。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64055371

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档