UnsafeMutablePointer<Float> to UnsafeMutablePointer<_>



我真的很疯狂,一个愚蠢且显然很简单的问题...我必须将Data转换为AVAudioPCMBuffer

寻找这个问题似乎很容易,但是随着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<_>'

有人可以解决这个问题吗?

检查Data的API参考,您可以找到3个copyBytes的过载:

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:(第二个)不是可选的。

最新更新