AudioKit:调用'AudioKit.stop()'后无法重新开始对频率的AudioKit采样。

问题描述 投票:0回答:1
我正在使用AudioKit 4.10。我使用以下简单代码从麦克风采样频率和幅度:

import AudioKit protocol MicAnalyzerDelegate { /** * The MicAnalyzer calls this delegate function. */ func micAnalyzerInfos(infos: (frequency : Double, amplitude : Double)?) } class MicAnalyzer: NSObject { // MARK: - Properties private static var micAnalyzer: MicAnalyzer = MicAnalyzer() var delegate: MicAnalyzerDelegate? fileprivate var mic: AKMicrophone! fileprivate var tracker: AKFrequencyTracker! fileprivate var silence: AKBooster! fileprivate var timer: Timer? // MARK: - Initializations private override init() { super.init() AKSettings.audioInputEnabled = true self.initMicTracker() } private func initMicTracker(){ /* Add the built-in microphone. */ mic = AKMicrophone() /* Add a traker */ tracker = AKFrequencyTracker(mic) silence = AKBooster(tracker, gain: 0) } // MARK: - Accessors class func shared() -> MicAnalyzer { return micAnalyzer } func startMonitoring() { /* Start the microphone and analyzer. */ AudioKit.output = silence do { try AudioKit.start() } catch { AKLog("AudioKit did not start!") } /* Initialize and schedule a new run loop timer. */ timer = Timer.scheduledTimer(timeInterval: 0.1, target: self, selector: #selector(MicAnalyzer.tick), userInfo: nil, repeats: true) } // Stopped as described here: https://github.com/AudioKit/AudioKit/issues/1716 func stopMonitoring() { do { AudioKit.disconnectAllInputs() try AudioKit.stop() try AudioKit.shutdown() } catch { print("AudioKit did not stop") } AudioKit.output = nil // Interrupts polling on tick infos timer?.invalidate() timer = nil } var infos: (frequency : Double, amplitude : Double)? { if(!tracker.isStopped){ let frequency = tracker.frequency let amplitude = tracker.amplitude return (frequency: frequency, amplitude: amplitude) } else { return nil } } /* Call the delegate. */ @objc func tick() { self.delegate?.micAnalyzerInfos(infos: infos) } }

按顺序调用以下代码,我遇到这种情况:

MicAnalyzer.shared().startMonitoring() // --> Everything works good MicAnalyzer.shared().stopMonitoring() // --> I think it is stopped correctly MicAnalyzer.shared().startMonitoring() // --> From now on the delegate is called but I get always 0 as frequency and amplitude

为什么在调出AudioKit.start()之后(在MicAnalyzer.shared().startMonitoring()内部)我无法再采样频率和幅度了?我应该如何重新启动整个过程? 


如果每次每次重新启动变量mictrackersilence时,内存都会增加,因为它们并未真正释放。这是相同代码思想的第二个版本:

import AudioKit protocol MicAnalyzerDelegate : class { /** * The tuner calls this delegate function */ func micAnalyzerInfos(infos: (frequency : Double, amplitude : Double)?) } // https://audiokit.io/examples/MicrophoneAnalysis/ class MicAnalyzer: NSObject { // MARK: - Properties private weak var delegate: MicAnalyzerDelegate? fileprivate var mic: AKMicrophone! fileprivate var tracker: AKFrequencyTracker! fileprivate var silence: AKBooster! fileprivate var timer: Timer? // MARK: - Initializations init(delegate: MicAnalyzerDelegate) { print("Init called!!!") self.delegate = delegate super.init() } deinit { print("Deinit called!!!") } // MARK: - Accessors func startMonitoring() { AKSettings.audioInputEnabled = true /* Add the built-in microphone. */ mic = AKMicrophone() /* Add a traker */ tracker = AKFrequencyTracker(mic) silence = AKBooster(tracker, gain: 0) /* Start the microphone and analyzer. */ AudioKit.output = silence do { try AudioKit.start() } catch { AKLog("AudioKit did not start!") } /* Initialize and schedule a new run loop timer. */ timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(MicAnalyzer.tick), userInfo: nil, repeats: true) } func stopMonitoring() { do { AudioKit.disconnectAllInputs() try AudioKit.stop() try AudioKit.shutdown() } catch { print("AudioKit did not stop") } AudioKit.output = nil // Interrupts polling on tick infos timer?.invalidate() timer = nil silence.stop() silence = nil tracker.stop() tracker = nil mic.stop() mic = nil } var infos: (frequency : Double, amplitude : Double)? { if(!tracker.isStopped){ let frequency = tracker.frequency let amplitude = tracker.amplitude return (frequency: frequency, amplitude: amplitude) } else { return nil } } /* Call the delegate. */ @objc func tick() { print(infos?.frequency ?? "0.0") //self.delegate.micAnalyzerInfos(infos: infos) } }

然后我可以按如下顺序调用该“第二个代码测试”:

override func viewDidAppear() { super.viewDidAppear() print("viewDidAppear!!!") tuner = Tuner(delegate: self) tuner?.startMonitoring() } override func viewDidDisappear() { super.viewDidDisappear() print("viewDidDisappear!!!") tuner?.stopMonitoring() tuner = nil }

我正在使用AudioKit 4.10。我使用以下简单代码从麦克风采样频率和幅度:导入AudioKit协议MicAnalyzerDelegate {/ ** * MicAnalyzer将此委托称为......>
swift audiokit akmicrophone
1个回答
0
投票
您需要确保AKFrequencyTracker是信号链的一部分,因为这是AVAudioEngine引擎的要求。

这意味着如果您这样做:

© www.soinside.com 2019 - 2024. All rights reserved.