我正在尝试创建ClipRecorder
的一些实例,以便稍后在我的应用中只需触发cliprecorder.start(...)
来记录剪辑。我有一个提供给AKMicrophone
的{{1}}实例。要创建剪辑记录器,我使用下一个设置:
ClipRecorder
跟踪:
for _ in 0 ... 4 {
let t = Track(microphone: microphone)
tracks.append(t)
}
麦克风:
init(microphone: Microphone) {
self.microphone = microphone
clipRecorder = AKClipRecorder(node: microphone.node)
}
第一个剪辑记录器确实已初始化,但是在第二个剪辑记录器中(在for循环中),应用程序崩溃(仅通过一个附加操作对其进行检查并起作用),这是日志:
class Microphone {
private var microphone: AKMicrophone = AKMicrophone()
private var micMixer: AKMixer!
private var micBooster: AKBooster!
var node: AKNode {
return micBooster
}
init(){
micMixer = AKMixer(microphone)
micBooster = AKBooster(micMixer)
micBooster.gain = 0.5
}
}
这看起来像麦克风节点无法与预初始化的剪辑记录器共享,我在做什么错呢?我可以想到的另一种可能性是无需创建剪辑记录器(因为我显然不是同时录制),然后在录制完成并调用回叫后,我将丢弃记录器并将剪辑移到播放器中(或剪辑播放器),这是正确的方向吗?
非常感谢。
答案 0 :(得分:0)
在经过数小时的调试,搜索AudioKit和SO的源代码之后,确定该问题的解决方法只是我需要在Track
中进行更改/添加的几行代码。
init(microphone: Microphone) {
self.microphone = microphone
}
func record(){
microphone.node.outputNode.removeTap(onBus: 0)
clipRecorder = AKClipRecorder(node: microphone.node)
}
removeTap
函数仅在deinit
的{{1}}中被调用,因此在您不对实例进行取消初始化之前,该抽头分配给了假设只有一个的麦克风总线点击分配的(reference here)。我要做的是在我使用剪辑记录器开始记录之前,手动调用此方法以清除麦克风总线上的抽头。这个SO thread是与AudioKit中其他类密切相关的问题,对我很有帮助。