首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Swift 3中AudioBufferList数据的提取

Swift 3中AudioBufferList数据的提取
EN

Stack Overflow用户
提问于 2016-09-24 18:42:28
回答 2查看 1.3K关注 0票数 5

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

代码语言:javascript
复制
    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位。

我想做的只是:

代码语言:javascript
复制
    withUnsafeMutablePointer(to: &bufferList.mBuffers.mData, {
        let monoSamples = [Float](UnsafeBufferPointer(start: $0, count:Int(inNumberFrames)))
    })

但是在这里我得到了一个编译错误:

表达式类型“浮点”是不明确的,没有更多的上下文。

怎么做才是对的?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-09-24 22:22:26

如果你不把你的代码转换成Swift 2,它就不能工作.在将代码转换为Swift 3时,您可能修改得太多了。

试试这个:

代码语言:javascript
复制
var monoSamples = [Float]()
let ptr = bufferList.mBuffers.mData?.assumingMemoryBound(to: Float.self)
monoSamples.append(contentsOf: UnsafeBufferPointer(start: ptr, count: Int(inNumberFrames)))
票数 7
EN

Stack Overflow用户

发布于 2016-09-24 19:55:49

试试这个可能吗?

是的,你是对的,你必须输入你的$0作为UnsafePointer。选择任何类型的UnsafePointer初始化程序,并在这里传递该值,以解释我在这里使用的bitPattern

代码语言:javascript
复制
UnsafeBufferPointer<Float>(start: UnsafePointer(bitPattern: i), count: Int(inNumberFrames))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39679758

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档