我真的很疯狂,一个愚蠢且显然很简单的问题...我必须将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:
(第二个)不是可选的。