Swift 非女性化指针<;浮动>;指向非女性化指针<_&燃气轮机;
我真的要为一个愚蠢而简单的问题发疯了。。。 我必须将Swift 非女性化指针<;浮动>;指向非女性化指针<_&燃气轮机;,swift,swift3,unsafemutablepointer,avaudiopcmbuffer,Swift,Swift3,Unsafemutablepointer,Avaudiopcmbuffer,我真的要为一个愚蠢而简单的问题发疯了。。。 我必须将数据转换为AVAudioPCMBuffer 看起来似乎很容易,但随着Swift 3的出现,一切都发生了变化。这种不断变化的诅咒语言(抱歉爆发) 我有这段代码 let audioBuffer = AVAudioPCMBuffer(pcmFormat: audioFormat!, frameCapacity: UInt32(data.count)/(audioFormat?.streamDescription.pointee.mBytesPerFr
数据
转换为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]))
let audioBuffer=AVAudioPCMBuffer(pcmFormat:audioFormat!帧容量:UInt32(data.count)/(audioFormat?.streamDescription.pointee.mBytesPerFrame)!)
audioBuffer.frameLength=audioBuffer.frameCapacity
let channels=UnsafeBufferPointer(开始:audioBuffer.floatChannelData,计数:Int(audioFormat!.channelCount))
data.copyBytes(到:UnsafeMutablePointer(通道[0]))
但最后一行给了我一个错误:
Cannot convert value of type 'UnsafeMutablePointer<Float>' to expected
argument type 'UnsafeMutablePointer<_>'
无法将“UnsafeMutablePointer”类型的值转换为预期值
参数类型“unsafemeutablepointer”
有人可以解决这个问题吗?检查,您可以发现3个copyBytes的重载:
它们都没有将unsafemeutablepointer
作为它的to:
参数
(在您的代码中,频道[0]
的类型变为UnsafeMutablePointer
,将其传递给UnsafeMutablePointer
的初始值设定项为“不做任何事情”。)
如果要调用第三个copyBytes
,则需要创建一个unsafemtablebufferpointer
,在您的情况下,DestinationType
应该是Float
_ = data.copyBytes(to: UnsafeMutableBufferPointer(start: channels[0], count: Int(audioBuffer.frameLength)))
(from:
参数在此copyBytes
中是可选的,在没有放入\uu=
的情况下,Swift抱怨没有使用结果。)
如果要使用copyBytes
的其他重载,可能需要将UnsafeMutablePointer
转换为UnsafeMutablePointer
。您可以在SO中的其他一些文章中找到如何做到这一点。请记住count:
和from:
(在第二行中)不是可选的。您可能必须将第三行声明为UnsafeBufferPointer
?它工作正常,但最后我不得不手动执行复制,因为我收到了[UInt8],需要将其转换为[Float32]。。。谢谢@Massimo你能演示一下你是如何手动复制并将[UInt8]转换为[Float32]的吗?@zzzel对于我的问题,我有一个包含n/2个样本(样本为2字节)的数据,我必须在一个浮点(介于-1.0和1.0之间)中转换每个样本(2字节)。如果您的问题是相同的,那么这就是我的代码(示例是一个Data
对象):for i in 0..@Massimo您是如何发现的?你是怎么知道的?好奇