【问题标题】:Extracting data from AudioBufferList in Swift 3在 Swift 3 中从 AudioBufferList 中提取数据
【发布时间】: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


【解决方案1】:

如果您未将代码转换为 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)))

【讨论】:

    【解决方案2】:

    试试这个可以吗?

    是的,你是对的,你必须输入你的$0UnsafePointer。选择任何类型的 UnsafePointer 初始化器并在此处传递该值,出于解释的目的,我在此处使用了 bitPattern

    UnsafeBufferPointer<Float>(start: UnsafePointer(bitPattern: i), count: Int(inNumberFrames))
    

    【讨论】:

    • 没有爱。现在的错误是:“表达式类型 'UnsafeBufferPointer' 在没有更多上下文的情况下是不明确的”
    • 谢谢,但我还是很困惑。我们在这里的 withUnsafeMutablePointer 闭包中,是吗? 0美元去哪儿了? monoSamples = [Float](UnsafeBufferPointer&lt;Float&gt;(start: UnsafePointer($0), count:Int(inNumberFrames))) 产生另一个错误。
    • 这是一个在 Swift Playground 中编译(嗯,应该编译)的要点:gist.github.com/anonymous/4d55cd1ec55a5f71246780f4819c94b3
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-10
    • 1970-01-01
    • 2017-08-27
    • 2018-06-15
    • 1970-01-01
    • 1970-01-01
    • 2017-06-27
    相关资源
    最近更新 更多