我真的因为一个很简单的愚蠢的问题而发疯.我必须将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<_>'有人能解决这个问题吗?
发布于 2016-11-30 17:54:33
通过检查Data,您可以找到3次copyBytes重载
func copyBytes(to: UnsafeMutablePointer, count: Int)
func copyBytes(to: UnsafeMutablePointer, from: Range)
func copyBytes(to: UnsafeMutableBufferPointer, from: Range?)
它们中没有一个使用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: (在第二个)不是可选的。
https://stackoverflow.com/questions/40892702
复制相似问题