1

我真的为一个愚蠢且看似简单的问题而发疯......我必须将 a 转换DataAVAudioPCMBuffer.

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

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

4

1 回答 1

2

检查API 参考Data,您可以找到 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:在 this 中参数是可选的copyBytes,如果没有 put _ =,Swift 会抱怨不使用结果。)

如果要使用 的其他重载copyBytes,可能需要转换UnsafeMutablePointer<Float>UnsafeMutablePointer<UInt8>. 您可以在 SO 的其他一些文章中找到如何做到这一点。请记住count:from:(在第二个中)不是可选的。

于 2016-11-30T17:54:33.257 回答