【发布时间】:2017-06-29 22:58:14
【问题描述】:
我现在有这个流程:我用 AudioEngine 录制音频,将其发送到音频处理库并取回音频缓冲区,然后我有强烈的意愿将其写入 wav 文件,但我完全不知道如何迅速做到这一点。
我已经从另一个 stackoverflow 答案中尝试了这个 sn-p,但它写入了一个空且损坏的文件。(load a pcm into a AVAudioPCMBuffer)
//get data from library
var len : CLong = 0
let res: UnsafePointer<Double> = getData(CLong(), &len )
let bufferPointer: UnsafeBufferPointer = UnsafeBufferPointer(start: res, count: len)
//tranform it to Data
let arrayDouble = Array(bufferPointer)
let arrayFloats = arrayDouble.map{Float($0)}
let data = try Data(buffer: bufferPointer)
//attempt to write in file
do {
let format = AVAudioFormat(commonFormat: .pcmFormatFloat32, sampleRate: 16000, channels: 2, interleaved: false)
var buffer = AVAudioPCMBuffer(pcmFormat: format, frameCapacity: AVAudioFrameCount(data.count))
buffer.floatChannelData!.pointee.withMemoryRebound(to: UInt8.self, capacity: data.count) {
let stream = OutputStream(toBuffer: $0, capacity: data.count)
stream.open()
_ = data.withUnsafeBytes {
stream.write($0, maxLength: data.count)
}
stream.close()
}
//settings are from AudioEngine.inputNode!.inputFormat(forBus: 0).settings
var audioFile = try AVAudioFile(forWriting: url, settings: settings)
try audioFile.write(from: buffer)
} catch let error as NSError {
print("ERROR HERE", error.localizedDescription)
}
所以,我想我对 floatChannelData 的这种转换是错误的,或者一切都错了。任何可以阅读它的建议或指针都会很棒!
【问题讨论】:
标签: ios swift audio core-audio audiotoolbox