Swift 在AKPlayer中播放后尝试录制时AudioKit崩溃

Swift 在AKPlayer中播放后尝试录制时AudioKit崩溃,swift,audiokit,Swift,Audiokit,这是我的问题。我有一个应用程序,可以从网上下载声音,然后播放。同时,该应用程序还具有录制和播放语音的功能。我使用两个不同的视图控制器来实现这两个功能。对于这些任务,我创建了一个singleton 当我启动应用程序并直接进入“录制视图控制器”时,一切正常(我可以录制声音,播放它,然后我可以使用声音进入第二个视图控制器,也可以毫无问题地播放它) 但是,如果我启动应用程序并首先播放声音(使用我的第二个视图控制器),然后转到录制视图控制器并尝试录制一些内容,我会收到以下消息:由于未捕获的异常“com.a

这是我的问题。我有一个应用程序,可以从网上下载声音,然后播放。同时,该应用程序还具有录制和播放语音的功能。我使用两个不同的视图控制器来实现这两个功能。对于这些任务,我创建了一个singleton

当我启动应用程序并直接进入“录制视图控制器”时,一切正常(我可以录制声音,播放它,然后我可以使用声音进入第二个视图控制器,也可以毫无问题地播放它)

但是,如果我启动应用程序并首先播放声音(使用我的第二个视图控制器),然后转到录制视图控制器并尝试录制一些内容,我会收到以下消息:由于未捕获的异常“com.apple.coreaudio.avfaudio”终止应用程序,原因:“[[busArray objectAtIndexedSubscript:(nsInteger)元素]setFormat:格式错误:&nsErr]:返回false,错误域=NSOSStatusErrorDomain Code=-10865“(null)”

这个崩溃发生在我录制recordButton时。这是在线发生的-请尝试recorder.record():

如果我设置category.playAndRecord,则会发生此崩溃

try audioSession.setCategory(.playAndRecord, mode: .default, options: .mixWithOthers)
我的单身班:

class AudioKitSingleton {
var mic: AKMicrophone!
var micMixer: AKMixer!
var recorder: AKNodeRecorder!
var tape: AKAudioFile!
var player: AKPlayer!
var micBooster: AKBooster!
var mainMixer: AKMixer!
var url: URL?
var name: String?
var artist: String?
var uploader: String?
var performer: String?
var load: Bool = false
var isPlay: Bool = false
var categoryID: Int? = nil

static let shared = AudioKitSingleton()

func initMic() {
    stopAudioKitEngine()
    AKAudioFile.cleanTempDirectory()
    AKSettings.bufferLength = .medium
    AKSettings.defaultToSpeaker = true
    setupRecordSession()
    mic = AKMicrophone()
    micMixer = AKMixer(mic)
    micBooster = AKBooster(micMixer)
    micBooster.gain = 0
    recorder = try? AKNodeRecorder(node: micMixer)
    if let file = recorder.audioFile {
        player = AKPlayer(audioFile: file)
    }
    player.isLooping = false
    mainMixer = AKMixer(player, micBooster)
    AudioKit.output = mainMixer
    startAudioKitEngine()
}

func deinitMic() {
    stopAudioKitEngine()
    mic = nil
    micMixer = nil
    recorder = nil
    tape = nil
    player = nil
    micBooster = nil
    mainMixer = nil
}

func startRecord() {
    if AKSettings.headPhonesPlugged {
        micBooster.gain = 1
    }
    micBooster.gain = 0
    do {
        try recorder.record()
    } catch {
        print("Can't record because: \(error)")
    }
}

func stopRecord() {
    micBooster.gain = 0
    tape = recorder.audioFile!
    player.load(audioFile: tape)
    player.prepare()
    if let _ = player.audioFile?.duration {
        recorder.stop()
    }
}

func resetRecorder() {
    do {
        try recorder.reset()
    } catch {
        print("Can't reset recorder because: \(error)")
    }
}

func playerPlayRecord() {
    player.play()
}

func playerStopRecord() {
    player.stop()
}

func setupRecordSession() {
    do {
        try audioSession.setCategory(.record, mode: .default, options: .mixWithOthers)
    } catch {
        print(error)
    }
}

func startAudioKitEngine() {
    do {
        try AudioKit.start()
    } catch {
        AKLog("AudioKit did not start because: \(error)")
    }
}

func stopAudioKitEngine() {
    if AudioKit.engine.isRunning {
        do {
            try AudioKit.stop()
        } catch {
            AKLog("AudioKit did not start because: \(error)")
        }
    }
}

func setupPlayer(url: URL) {
    if AudioKit.engine.isRunning {
    stopAudioKitEngine()
    }
    player = try AKPlayer(url: url)
    AudioKit.output = player
    startAudioKitEngine()
}

func setupPlayer(mixloop: AVAudioFile) {
    if AudioKit.engine.isRunning {
    stopAudioKitEngine()
    }
    player = try AKPlayer(audioFile: mixloop)
    AudioKit.output = player
    startAudioKitEngine()
}

func play() {
    try player?.play()
}

func resume() {
    try player?.resume()
}

func stop() {
    player?.stop()
}

func pause() {
    player?.pause()
}

func remove() {
    if AudioKit.engine.isRunning {
        try? AudioKit.stop()
        player?.stop()
        player = nil
        recorder = nil
        AudioKit.output = nil
        url = nil
        name = nil
        artist = nil
        uploader = nil
        load = false
        isPlay = false
    }
}
}


除了iphone5s、iOS12之外,所有iPhone都会发生这种崩溃。需要帮助。

我很确定这将在今天的AudioKit 4.5.2版本中得到解决,现在就上传

class AudioKitSingleton {
var mic: AKMicrophone!
var micMixer: AKMixer!
var recorder: AKNodeRecorder!
var tape: AKAudioFile!
var player: AKPlayer!
var micBooster: AKBooster!
var mainMixer: AKMixer!
var url: URL?
var name: String?
var artist: String?
var uploader: String?
var performer: String?
var load: Bool = false
var isPlay: Bool = false
var categoryID: Int? = nil

static let shared = AudioKitSingleton()

func initMic() {
    stopAudioKitEngine()
    AKAudioFile.cleanTempDirectory()
    AKSettings.bufferLength = .medium
    AKSettings.defaultToSpeaker = true
    setupRecordSession()
    mic = AKMicrophone()
    micMixer = AKMixer(mic)
    micBooster = AKBooster(micMixer)
    micBooster.gain = 0
    recorder = try? AKNodeRecorder(node: micMixer)
    if let file = recorder.audioFile {
        player = AKPlayer(audioFile: file)
    }
    player.isLooping = false
    mainMixer = AKMixer(player, micBooster)
    AudioKit.output = mainMixer
    startAudioKitEngine()
}

func deinitMic() {
    stopAudioKitEngine()
    mic = nil
    micMixer = nil
    recorder = nil
    tape = nil
    player = nil
    micBooster = nil
    mainMixer = nil
}

func startRecord() {
    if AKSettings.headPhonesPlugged {
        micBooster.gain = 1
    }
    micBooster.gain = 0
    do {
        try recorder.record()
    } catch {
        print("Can't record because: \(error)")
    }
}

func stopRecord() {
    micBooster.gain = 0
    tape = recorder.audioFile!
    player.load(audioFile: tape)
    player.prepare()
    if let _ = player.audioFile?.duration {
        recorder.stop()
    }
}

func resetRecorder() {
    do {
        try recorder.reset()
    } catch {
        print("Can't reset recorder because: \(error)")
    }
}

func playerPlayRecord() {
    player.play()
}

func playerStopRecord() {
    player.stop()
}

func setupRecordSession() {
    do {
        try audioSession.setCategory(.record, mode: .default, options: .mixWithOthers)
    } catch {
        print(error)
    }
}

func startAudioKitEngine() {
    do {
        try AudioKit.start()
    } catch {
        AKLog("AudioKit did not start because: \(error)")
    }
}

func stopAudioKitEngine() {
    if AudioKit.engine.isRunning {
        do {
            try AudioKit.stop()
        } catch {
            AKLog("AudioKit did not start because: \(error)")
        }
    }
}

func setupPlayer(url: URL) {
    if AudioKit.engine.isRunning {
    stopAudioKitEngine()
    }
    player = try AKPlayer(url: url)
    AudioKit.output = player
    startAudioKitEngine()
}

func setupPlayer(mixloop: AVAudioFile) {
    if AudioKit.engine.isRunning {
    stopAudioKitEngine()
    }
    player = try AKPlayer(audioFile: mixloop)
    AudioKit.output = player
    startAudioKitEngine()
}

func play() {
    try player?.play()
}

func resume() {
    try player?.resume()
}

func stop() {
    player?.stop()
}

func pause() {
    player?.pause()
}

func remove() {
    if AudioKit.engine.isRunning {
        try? AudioKit.stop()
        player?.stop()
        player = nil
        recorder = nil
        AudioKit.output = nil
        url = nil
        name = nil
        artist = nil
        uploader = nil
        load = false
        isPlay = false
    }
}