У меня странный случай - я использую AKRecorder для записи коротких сегментов с AKMicrophone. Однако случайно, время от времени, микрофон замолкает. Иногда это происходит довольно быстро, иногда это занимает несколько минут.
Я сократил код до минимума, чтобы повторить эту проблему. По сути, я делаю следующее:
- Передача экземпляра
AKMicrophone
в экземпляр AKBooster
. - Использование экземпляра
AKBooster
для создания экземпляра AKNodeRecorder
и AKMixer
. - Передача
AKMixer
на выход AudioKit. - Начало записи
AKRecorder
. - Запуск таймера каждые 2 секунды, который сбрасывает AKNodeRecorder и попросить его начать запись снова.
Вот код:
import UIKit
import AudioKit
import AudioKitUI
class TempViewController: UIViewController {
var recorder: AKNodeRecorder!
var micBooster: AKBooster!
var mainMixer: AKMixer!
var timer: Timer?
let mic = AKMicrophone()
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
do {
try AKSettings.setSession(category: .playAndRecord, with: .allowBluetoothA2DP)
} catch {
AKLog("Could not set session category.")
}
AKSettings.defaultToSpeaker = true
micBooster = AKBooster(mic)
do {
recorder = try AKNodeRecorder(node: micBooster)
} catch {
AKLog("Couldn't create Recorder")
}
mainMixer = AKMixer(micBooster)
AudioKit.output = mainMixer
do {
try AudioKit.start()
} catch {
AKLog("AudioKit did not start!")
}
}
override func viewDidLoad() {
super.viewDidLoad()
self.timer = Timer.scheduledTimer(timeInterval: 2, target: self, selector: #selector(repeatRecorder), userInfo: nil, repeats: true)
do {
try recorder.record()
} catch { AKLog("Error on first record")}
}
@objc func repeatRecorder() {
do {
try self.recorder.reset()
try self.recorder.record()
} catch { AKLog("Errored recording.") }
}
}
Я был бы очень признателен за помощь, если у кого-либо есть идеи:
- как не дать микрофону замолчать.
- как определить, когда mi c замолчал, и снова его разбудить.
Если вам нужен проект github, который иллюстрирует проблему, вот он: https://github.com/craiggrummitt/AudioKitBug
Чтобы добавить AudioKit, вам нужно вызвать 'pod update'.