首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UnsafeMutablePointer<Float>到UnsafeMutablePointer<_>

UnsafeMutablePointer<Float>到UnsafeMutablePointer<_>
EN

Stack Overflow用户
提问于 2016-11-30 15:56:19
回答 1查看 1.7K关注 0票数 1

我真的因为一个很简单的愚蠢的问题而发疯.我必须将Data转换为AVAudioPCMBuffer

this question的角度看,这似乎很容易,但是随着Swift 3的出现,一切都发生了变化。这种不断变化的被诅咒的语言(对不起)!

我有一段代码

代码语言:javascript
复制
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]))

但是最后一行给了我一个错误:

代码语言:javascript
复制
Cannot convert value of type 'UnsafeMutablePointer<Float>' to expected 
argument type 'UnsafeMutablePointer<_>'

有人能解决这个问题吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-30 17:54:33

通过检查Data,您可以找到3次copyBytes重载

func copyBytes(to: UnsafeMutablePointer, count: Int)

func copyBytes(to: UnsafeMutablePointer, from: Range)

func copyBytes(to: UnsafeMutableBufferPointer, from: Range?)

它们中没有一个使用UnsafeMutablePointer<Float>作为它的to:参数。

(在您的代码中,channels[0]的类型变为UnsafeMutablePointer<Float>,将其传递给UnsafeMutablePointer<Float>的初始化程序是“什么都不做”)。

如果要调用第三个copyBytes,则需要创建一个UnsafeMutableBufferPointer<DestinationType>,在您的示例中,DestinationType应该是Float

代码语言:javascript
复制
_ = data.copyBytes(to: UnsafeMutableBufferPointer(start: channels[0], count: Int(audioBuffer.frameLength)))

(from:参数在这个copyBytes中是可选的,没有放入_ =,Swift抱怨没有使用结果。)

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40892702

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档