我正在接收音频缓冲区,并将它们转换为传统数组以便于使用。这段代码一直是可靠的。然而,最近它开始频繁崩溃。我在使用 Airpods 时发生崩溃,这可能是也可能不是问题的一部分。麦克风对象是来自 AudioKit 的 AKMicrophone 对象。
func tap(){
let recordingFormat = mic.outputNode.inputFormat(forBus: 0)
mic.outputNode.removeTap(onBus: 0)
mic.outputNode.installTap(onBus: 0,
bufferSize: UInt32(recordingBufferSize),
format: recordingFormat)
{ (buffer, when) in
let stereoDataUnsafePointer = buffer.floatChannelData!
let monoPointer = stereoDataUnsafePointer.pointee
let count = self.recordingBufferSize
let bufferPointer = UnsafeBufferPointer(start: monoPointer, count: count)
let array = Array(bufferPointer) //CRASHES HERE
}
mic.start()
}
在带有 Airpods 的 iPhone 7 上运行时,崩溃大约 7/10 次,并显示以下两种不同的错误消息之一: EXC_BAD_ACCESS fatal error :UnsafeMutablePointer.initialize重叠范围
如果我转换数组的方式是错误的,我会期望它每次都会崩溃。我推测录音采样率可能是一个问题。
最佳答案
我找到了答案。我将缓冲区大小硬编码为 10000,并在启动 Tap 时指定缓冲区大小为 10000。但是,设备忽略了此缓冲区大小,而是向我发送了 6400 的缓冲区。这意味着当我尝试初始化大小为 10000 的数组时它结束了。我修改了代码来检查实际的缓冲区大小,而不是我请求的大小:
let stereoDataUnsafePointer = buffer.floatChannelData!
let monoPointer = stereoDataUnsafePointer.pointee
let count = buffer.frameLength //<--Check actual buffer size
let bufferPointer = UnsafeBufferPointer(start: monoPointer, count: Int(count))
let array = Array(bufferPointer)
关于Swift 数组(bufferPointer)EXC_BAD_ACCESS 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57210160/