【发布时间】:2016-09-24 18:42:28
【问题描述】:
我正在尝试从渲染的 AudioBufferList 中提取本机 [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 中,这编译没有错误,但在运行时我遇到了崩溃:
致命错误:不能在不同大小的类型之间使用 unsafeBitCast
这有点令人惊讶; Swift的Float是32位的,流的数据是32位的。
我想做的只是:
withUnsafeMutablePointer(to: &bufferList.mBuffers.mData, {
let monoSamples = [Float](UnsafeBufferPointer(start: $0, count:Int(inNumberFrames)))
})
但是我得到一个编译错误:
表达式类型 '[Float]' 在没有更多上下文的情况下是模棱两可的
这样做的正确方法是什么?
【问题讨论】:
-
这是一个在 Swift Playground 中编译(嗯,应该编译)的要点:gist.github.com/anonymous/4d55cd1ec55a5f71246780f4819c94b3
标签: ios swift core-audio swift3