1

私は愚かで明らかに単純な問題で本当に夢中になっています...私は aDataを に変換する必要があり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]))

しかし、この最後の行は私にこのエラーを与えます:

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:

(そして、あなたのコードでは、の型は become にchannels[0]なりUnsafeMutablePointer<Float>、それを の初期化子に渡すと、UnsafeMutablePointer<Float>「何もしない」になります。)

3番目を呼び出したい場合はcopyBytes、を作成する必要がUnsafeMutableBufferPointer<DestinationType>あり、あなたの場合DestinationTypeFloat.

_ = data.copyBytes(to: UnsafeMutableBufferPointer(start: channels[0], count: Int(audioBuffer.frameLength)))

(from:引数は thiscopyBytesではオプションであり、 を入れないと_ =、Swift は結果を使用しないと不平を言います。)

の他のオーバーロードを使用する場合は、に変換するcopyBytes必要がある場合があります。その方法は、SO の他の記事で見つけることができます。および(2 番目の) はオプションではないことを覚えておいてください。UnsafeMutablePointer<Float>UnsafeMutablePointer<UInt8>count:from:

于 2016-11-30T17:54:33.257 に答える