ios - 在 Swift 3 中从 AudioBufferList 中提取数据

标签 ios swift core-audio swift3

我正在尝试从呈现的 AudioBufferList 中提取 native [Float] 数组,其中音频单元的流设置为 32 位浮点。在 Swift 1 和 2 中,我这样做了:

    var monoSamples = [Float]()
    for i in 0..<Int(inNumberFrames) {
        withUnsafePointer(to: &bufferList.mBuffers.mData, {
            let ptr = $0
            let newPtr = ptr + i
            let sample = unsafeBitCast(newPtr.pointee, to: Float.self)
            monoSamples.append(sample)
        })
    }

无疑这不是最快的方法,但它确实有效。在 Swift 3 中,编译没有错误,但在运行时我遇到了崩溃:

fatal error: can't unsafeBitCast between types of different sizes

这有点令人惊讶; Swift 的 Float 是 32 位的,流的数据是 32 位的。

我想做的很简单:

    withUnsafeMutablePointer(to: &bufferList.mBuffers.mData, {
        let monoSamples = [Float](UnsafeBufferPointer(start: $0, count:Int(inNumberFrames)))
    })

但是我得到一个编译错误:

Expression type '[Float]' is ambiguous without more context

正确的做法是什么?

最佳答案

如果您未将代码转换为 Swift 2,则它不起作用。将代码转换为 Swift 3 时,您可能修改太多。

试试这个:

var monoSamples = [Float]()
let ptr = bufferList.mBuffers.mData?.assumingMemoryBound(to: Float.self)
monoSamples.append(contentsOf: UnsafeBufferPointer(start: ptr, count: Int(inNumberFrames)))

关于ios - 在 Swift 3 中从 AudioBufferList 中提取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39679758/

相关文章:

iphone - 如何获取 UIGraphicsPushContext 参数的上下文?

ios - 从 swift 3 中的消息扩展打开应用程序

Swift 如何根据内容改变 uicollectionviewcell 的高度

swift - 如何在 ARKit 中使用环境贴图?

macos - 拦截 Mac os 中的所有系统级音频

objective-c - ARC 不允许将 Objective-C 指针隐式转换为 'void *'

ios - 为 UITableView 过滤的 KVO NSMutableArray

ios - 子容器 View 中的 UILabel 未更新

ios - 使用 Swift for iOS 实现 Google Classroom API 时遇到问题 : Possible missing bridging header file

ios - 有没有办法将语音处理io音频单元路由到蓝牙设备?