我正在尝试从呈现的AudioBufferList中提取本机浮点数组,其中音频单元的流被设置为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的浮点数是32位,流的数据是32位。
我想做的只是:
withUnsafeMutablePointer(to: &bufferList.mBuffers.mData, {
let monoSamples = [Float](UnsafeBufferPointer(start: $0, count:Int(inNumberFrames)))
})但是在这里我得到了一个编译错误:
表达式类型“浮点”是不明确的,没有更多的上下文。
怎么做才是对的?
发布于 2016-09-24 22:22:26
如果你不把你的代码转换成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)))发布于 2016-09-24 19:55:49
试试这个可能吗?
是的,你是对的,你必须输入你的$0作为UnsafePointer。选择任何类型的UnsafePointer初始化程序,并在这里传递该值,以解释我在这里使用的bitPattern。
UnsafeBufferPointer<Float>(start: UnsafePointer(bitPattern: i), count: Int(inNumberFrames))https://stackoverflow.com/questions/39679758
复制相似问题