如何解决从AVAudioNodeTap向AVAudioFile写入缓冲区保存来自AVAudioEngine的音频记录
我正在使用AVAudioEngine监视麦克风输入。 AudioEngine停止后,我想将接收到的音频保存到AVAudioFile中,以备将来使用。
这是我当前的实现,文件中确实包含数据。它是一个wav文件,但不是可播放的音频文件。我想我的格式可能有问题,这是我的方法。
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)")
}
}
解决方法
这是因为您尚未关闭要录制到的 AVAudioFile。停止引擎时将文件设置为 nil 即可播放 wav 文件。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。