2017-05-30 151 views
1

我正在構建一個必須跟蹤用戶麥克風輸入幅度的應用程序。 AudioKit爲我的需求提供了一堆方便的對象:AKAmplitudeTracker等等。我還沒有找到任何可行的信息,如何啓動AudioKit,開始跟蹤等。什麼是管理AudioKit生命週期的正確方法?

現在所有與AudioKit初始化相關的代碼都在我的根音頻錄音模塊VC的viewDidLoad方法中。這是不正確的,因爲隨機錯誤發生,我不能跟蹤什麼是錯的。下面的代碼顯示了我現在如何使用AudioKit。

var silence: AKBooster! 
    var tracker: AKAmplitudeTracker! 
    var mic: AKMicrophone! 

     ... 

     override func viewDidLoad() { 
     super.viewDidLoad() 

     switch AVAudioSession.sharedInstance().recordPermission() { 

      case AVAudioSessionRecordPermission.granted: 

       self.mic = AKMicrophone() 
       self.tracker = AKAmplitudeTracker(self.mic) 
       AKSettings.audioInputEnabled = true 
       AudioKit.output = self.tracker 
       AudioKit.start() 
       self.mic.start() 
       self.tracker.start() 

       break 

      case AVAudioSessionRecordPermission.undetermined: 

       AVAudioSession.sharedInstance().requestRecordPermission { 
       (granted) in 

       if granted { 

        self.mic = AKMicrophone() 
        self.tracker = AKAmplitudeTracker(self.mic) 
        AKSettings.audioInputEnabled = true 
        AudioKit.output = self.tracker 
        AudioKit.start() 
        self.mic.start() 
        self.tracker.start() 

       } 

       } 
      case AVAudioSessionRecordPermission.denied: 

       AVAudioSession.sharedInstance().requestRecordPermission { 
       (granted) in 

       if granted { 

        self.mic = AKMicrophone() 
        self.tracker = AKAmplitudeTracker(self.mic) 
        AKSettings.audioInputEnabled = true 
        AudioKit.output = self.tracker 
        AudioKit.start() 
        self.mic.start() 
        self.tracker.start() 

       } 

       } 


      default: 
       print("") 
      } 

      ... 

     } 

請幫我弄清楚如何正確管理AudioKit。

回答

0

阿列克謝,

我管理AudioKit的生命週期的建議是一個單獨的類中容納它。這就是它在回購中包含的一些AudioKit示例中的設置方式,例如Analog Synth XDrums。這樣,它就不會綁定到特定的ViewController的viewDidLoad,並且可以從多個ViewControllers或管理應用程序狀態的AppDelegate訪問。它還確保您只會創建它的一個實例。

在此處,AudioKit被一個調用,Conductor類中初始化的例子(也可以被稱爲AudioManager等):

import AudioKit 
import AudioKitUI 

// Treat the conductor like a manager for the audio engine. 
class Conductor { 

    // Singleton of the Conductor class to avoid multiple instances of the audio engine 
    static let sharedInstance = Conductor() 

    // Create instance variables 
    var mic: AKMicrophone! 
    var tracker: AKAmplitudeTracker! 

    // Add effects 
    var delay: AKDelay! 
    var reverb: AKCostelloReverb! 

    // Balance between the delay and reverb mix. 
    var reverbAmountMixer = AKDryWetMixer() 

    init() { 

     // Allow audio to play while the iOS device is muted. 
     AKSettings.playbackWhileMuted = true 

     AKSettings.defaultToSpeaker = true 

     // Capture mic input 
     mic = AKMicrophone() 

     // Pull mic output into the tracker node. 
     tracker = AKAmplitudeTracker(mic) 

     // Pull the tracker output into the delay effect node. 
     delay = AKDelay(tracker) 
     delay.time = 2.0 
     delay.feedback = 0.1 
     delay.dryWetMix = 0.5 

     // Pull the delay output into the reverb effect node. 
     reverb = AKCostelloReverb(delay) 
     reverb.presetShortTailCostelloReverb() 

     // Mix the amount of reverb to the delay output node. 
     reverbAmountMixer = AKDryWetMixer(delay, reverb, balance: 0.8) 

     // Assign the reverbAmountMixer output to be the final audio output 
     AudioKit.output = reverbAmountMixer 

     // Start the AudioKit engine 
     // This is in its own method so that the audio engine will start and stop via the AppDelegate's current state. 
     startAudioEngine() 

    } 

    internal func startAudioEngine() { 
     AudioKit.start() 
     print("Audio engine started") 
    } 

    internal func stopAudioEngine() { 
     AudioKit.stop() 
     print("Audio engine stopped") 
    } 
} 

以下是如何訪問真實發生的Conductor singletone類內從振幅跟蹤數據該視圖控制器:

import UIKit 

class ViewController: UIViewController { 

    var conductor = Conductor.sharedInstance 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     Timer.scheduledTimer(withTimeInterval: 0.01, repeats: true) { [unowned self] (timer) in 
      print(self.conductor.tracker.amplitude) 
     } 

    } 
} 

你可以從這裏下載這個GitHub庫:

https://github.com/markjeschke/AudioKit-Amplitude-Tracker

我希望這有助於。

保重,
馬克

2

從我所看到的情況看,它看起來應該是有效的,在你的代碼的其他地方可能會發生一些事情。我做了一個精簡的演示來測試基礎知識,它的工作原理。我只是添加了一個計時器來輪詢振幅。

import UIKit 
import AudioKit 

class ViewController: UIViewController { 

    var mic: AKMicrophone! 
    var tracker: AKAmplitudeTracker! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     mic = AKMicrophone() 
     tracker = AKAmplitudeTracker(mic) 
     AudioKit.output = tracker 
     AudioKit.start() 

     Timer.scheduledTimer(withTimeInterval: 0.1, repeats: true) { (timer) in 
      print(self.tracker.amplitude) 
     } 
    } 
} 
+0

是啊,我的代碼工作。但有時跟蹤器不能啓動,它會輸出恆定值,如0.0066 ..等,而不是各種值。或者我在AudioKit.start()控制檯上發現致命錯誤,說'hwFormat'和其他CoreAudio部件有問題。所以我認爲我以錯誤的方式處理AudioKit。 –

+0

隨着奇怪的音頻錯誤,它很可能是一個操作系統錯誤。嘗試重新啓動設備。 – dave234

+0

如果我需要間隔小於0.1秒的計時器,該怎麼辦?我正在考慮像addPeriodicTimeObserver類似的東西...類似的AudioKit? – Ibdakine

相關問題