在 Swift 3 中从 AudioBufferList 中提取数据
Extracting data from AudioBufferList in Swift 3
我正在尝试从呈现的 AudioBufferList 中提取本机 [Float] 数组,其中音频单元的流设置为 32 位浮点。在 Swift 1 和 2 中,我这样做了:
var monoSamples = [Float]()
for i in 0..<Int(inNumberFrames) {
withUnsafePointer(to: &bufferList.mBuffers.mData, {
let ptr = [=11=]
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的浮点数是32位的,流的数据是32位的。
我想做的只是:
withUnsafeMutablePointer(to: &bufferList.mBuffers.mData, {
let monoSamples = [Float](UnsafeBufferPointer(start: [=12=], count:Int(inNumberFrames)))
})
但是我得到一个编译错误:
Expression type '[Float]' is ambiguous without more context
正确的做法是什么?
试试这个可能是?
是的,你是对的,你必须输入 [=11=]
作为 UnsafePointer
。选择任何类型的 UnsafePointer
初始值设定项并在此处传递该值,出于解释目的,我在此处使用了 bitPattern
。
UnsafeBufferPointer<Float>(start: UnsafePointer(bitPattern: i), count: Int(inNumberFrames))
如果您未将代码转换为 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)))
我正在尝试从呈现的 AudioBufferList 中提取本机 [Float] 数组,其中音频单元的流设置为 32 位浮点。在 Swift 1 和 2 中,我这样做了:
var monoSamples = [Float]()
for i in 0..<Int(inNumberFrames) {
withUnsafePointer(to: &bufferList.mBuffers.mData, {
let ptr = [=11=]
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的浮点数是32位的,流的数据是32位的。
我想做的只是:
withUnsafeMutablePointer(to: &bufferList.mBuffers.mData, {
let monoSamples = [Float](UnsafeBufferPointer(start: [=12=], count:Int(inNumberFrames)))
})
但是我得到一个编译错误:
Expression type '[Float]' is ambiguous without more context
正确的做法是什么?
试试这个可能是?
是的,你是对的,你必须输入 [=11=]
作为 UnsafePointer
。选择任何类型的 UnsafePointer
初始值设定项并在此处传递该值,出于解释目的,我在此处使用了 bitPattern
。
UnsafeBufferPointer<Float>(start: UnsafePointer(bitPattern: i), count: Int(inNumberFrames))
如果您未将代码转换为 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)))