2016-11-30 59 views
1

我真的要疯了傻,显然简单的问题...... 我有一个Data转换为AVAudioPCMBufferUnsafeMutablePointer <Float>到UnsafeMutablePointer <_>

寻找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<_>' 

五月某人有一个解决的办法?

+0

您可能需要将第三行声明为UnsafeBufferPointer '? – sdasdadas

回答

1

检查API Reference of Data,你可以找到的copyBytes 3个重载:

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可选的,没有把_ =,斯威夫特抱怨没有使用的结果。)

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

+0

它工作正常,但最后我不得不手动执行副本,因为我收到了一个[UInt8]并需要将其转换为[Float32] ...谢谢! – Massimo

+0

@Massimo你可以展示你如何手动完成复制并将[UInt8]转换为[Float32]? – zzzel

+0

@zzzel对于我的问题,我有一个数据包含n/2个样本(2个字节的样本),我不得不在每个样本(2个字节)在一个浮点数(-1.0和1.0之间)。如果你的问题是相同的,那么这就是我的代码(样本是一个'Data'object):'对于我在0 .. Massimo

相关问题