我AVAudioEngine
用来播放声音文件并将输出记录到文件中。我有很多音效文件,每个都通过点击一个按钮来播放。为了播放文件,我创建了一个AVAudioPlayerNode
并将其连接到引擎。文件播放后,我尝试在 completionHandler 闭包中断开/分离节点,以释放内存。如果我不删除节点,我将继续向引擎添加新节点和新连接。
但是,下次我尝试播放文件时,应用程序就会冻结。这是我的代码:
let url = NSBundle.mainBundle().URLForResource(name, withExtension: "wav")!
let audioPlayerFile = try AVAudioFile(forReading: url)
let playerNode = AVAudioPlayerNode()
self.engine.attachNode(playerNode)
self.engine.connect(playerNode, to: self.engine.mainMixerNode, format: audioPlayerFile.processingFormat)
playerNode.scheduleFile(audioPlayerFile, atTime: nil, completionHandler: { () -> Void in
self.engine.disconnectNodeOutput(playerNode)
self.engine.detachNode(playerNode)
})
playerNode.play()
实现这样的功能的最佳方式是什么,即在录制时播放多个文件,可能相互重叠?