连接到多个cliprecorder的麦克风使应用崩溃

时间:2018-10-03 15:13:10

标签: ios swift audio audiokit

我正在尝试创建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
    }
}

这看起来像麦克风节点无法与预初始化的剪辑记录器共享,我在做什么错呢?我可以想到的另一种可能性是无需创建剪辑记录器(因为我显然不是同时录制),然后在录制完成并调用回叫后,我将丢弃记录器并将剪辑移到播放器中(或剪辑播放器),这是正确的方向吗?

非常感谢。

1 个答案:

答案 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中其他类密切相关的问题,对我很有帮助。