Swift 数组(bufferPointer)EXC_BAD_ACCESS 崩溃

标签 swift pointers audio crash buffer

我正在接收音频缓冲区,并将它们转换为传统数组以便于使用。这段代码一直是可靠的。然而,最近它开始频繁崩溃。我在使用 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/

相关文章:

ios - 下标的使用不明确。数组 Swift IOS

无法打印 C 中的返回值

ios - 延迟 : Swift 3 从 SuperView 中删除 View

swift - 取消搜索栏时,所选行正在更改

ios - 如何接受多种类型作为函数中的参数?

android - Android Studio 示例代码中 setAudioSource 失败

c# - 通过此代码更改音频采样率,当前会更改位深度吗?

c++ - 指向数组的字符指针转换为指向指针的字符指针

c - 可疑指针转换警告

c# - Xamarin IOS : unable to play mp3 from internet