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您是如何发现的?你是怎么知道的?好奇