UnsafeMutablePointer<Float> 到 UnsafeMutablePointer<_>
Posted
技术标签:
【中文标题】UnsafeMutablePointer<Float> 到 UnsafeMutablePointer<_>【英文标题】:UnsafeMutablePointer<Float> to UnsafeMutablePointer<_> 【发布时间】:2016-11-30 15:56:19 【问题描述】:我真的被一个愚蠢且看似简单的问题发疯了......
我必须将Data
转换为AVAudioPCMBuffer
。
看this question 似乎很容易,但随着 Swift 3 一切都变了。这种被诅咒的语言不断变化(抱歉爆发)!
我有这段代码
let audioBuffer = AVAudioPCMBuffer(pcmFormat: audioFormat!, frameCapacity: UInt32(data.count)/(audioFormat?.streamDescription.pointee.mBytesPerFrame)!)
audioBuffer.frameLength = audioBuffer.frameCapacity
let channels = UnsafeBufferPointer(start: audioBuffer.floatChannelData, count: Int(audioFormat!.channelCount))
data.copyBytes(to: UnsafeMutablePointer<Float>(channels[0]))
但是最后一行给了我这个错误:
Cannot convert value of type 'UnsafeMutablePointer<Float>' to expected
argument type 'UnsafeMutablePointer<_>'
有人可以解决这个问题吗?
【问题讨论】:
您可能需要将第三行声明为UnsafeBufferPointer<Float>
?
【参考方案1】:
查看API Reference of Data
,可以发现copyBytes
的3个重载:
func copyBytes(to: UnsafeMutablePointer<UInt8>, count: Int)
func copyBytes(to: UnsafeMutablePointer<UInt8>, from: Range<Data.Index>)
func copyBytes<DestinationType>(to: UnsafeMutableBufferPointer<DestinationType>, from: Range<Data.Index>?)
它们都没有将UnsafeMutablePointer<Float>
作为其to:
参数。
(在您的代码中,channels[0]
的类型变为 UnsafeMutablePointer<Float>
,将其传递给 UnsafeMutablePointer<Float>
的初始化程序是“什么都不做”。)
如果你想调用第三个copyBytes
,你需要创建一个UnsafeMutableBufferPointer<DestinationType>
,在你的情况下DestinationType
应该是Float
。
_ = data.copyBytes(to: UnsafeMutableBufferPointer(start: channels[0], count: Int(audioBuffer.frameLength)))
(from:
参数在这个copyBytes
中是可选的,如果不输入_ =
,Swift 会抱怨没有使用结果。)
如果您想使用copyBytes
的其他重载,您可能需要将UnsafeMutablePointer<Float>
转换为UnsafeMutablePointer<UInt8>
。您可以在 SO 的其他一些文章中找到如何做到这一点。请记住count:
和from:
(在第二个中)不是可选的。
【讨论】:
它工作正常,但最后我不得不手动执行复制,因为我收到了 [UInt8] 并需要将其转换为 [Float32]...谢谢! @Massimo 你能展示一下你是如何手动复制并将 [UInt8] 转换为 [Float32] 的吗? @zzzel 对于我的问题,我有一个包含 n/2 个样本(样本 2 个字节)的数据,我必须将每个样本(2 个字节)转换为一个浮点数(介于 -1.0 和 1.0 之间)。如果您的问题相同,这是我的代码(示例是Data
object):for i in 0..<samples.count/2 floatArray[i] = Float(Int16(samples[i*2+1]) << 8 | Int16(samples[i*2]))/Float(INT16_MAX)
@Massimo 你是怎么想出来的?你怎么知道它是 [UInt8]?好奇以上是关于UnsafeMutablePointer<Float> 到 UnsafeMutablePointer<_>的主要内容,如果未能解决你的问题,请参考以下文章
UnsafeMutablePointer<Float> 到 UnsafeMutablePointer<_>
如何将该 UnsafeMutablePointer<UnsafeMutablePointer<Float>> 变量转换为 AudioBufferList?
如何用 arg 编写块。 Swift 闭包中的“UnsafeMutablePointer<UnsafeMutablePointer<Float>>”
CoreGraphics - 不能用 UnsafeMutablePointer<UInt8> 替换 UnsafeMutablePointer<UInt32>
swift3.0 无法将类型“[UnsafeMutablePointer<Int8>]”的值转换为预期的参数类型“UnsafeMutablePointer<Int8>?”