2017-04-03 118 views
7

我試圖用AVAudioRecorder錄製音頻。我需要建立這樣一個簡單的波形:iOS:創建簡單的音頻波形動畫

enter image description here

當用戶對着麥克風圓圈表示用戶的語音的水平。我試圖衡量這段代碼的聲音,但代碼未檢測到任何緩衝,而不是工作:

func levelTimerCallback(timer:Timer) { 

    //we have to update meters before we can get the metering values 
    audioRecorder.updateMeters() 

    //print to the console if we are beyond a threshold value. Here I've used -7 
    if audioRecorder.averagePower(forChannel: 1) > -7 { 

     print(" level I'm hearin' you in dat mic ") 
     print(audioRecorder.averagePower(forChannel: 0)) 
    } 
}  

錄製音頻:

func startRecording() { 

     let audioSession = AVAudioSession.sharedInstance() 
     do { 

     // Audio Settings 
      settings = [ 
       AVFormatIDKey: Int(kAudioFormatMPEG4AAC), 
       AVSampleRateKey: 12000, 
       AVNumberOfChannelsKey: 1, 
       AVEncoderAudioQualityKey: AVAudioQuality.high.rawValue 
      ] 


      audioRecorder = try AVAudioRecorder(url: self.directoryURL(), settings: settings) 
      audioRecorder.delegate = self 
      audioRecorder.prepareToRecord() 
      audioRecorder.isMeteringEnabled = true 


     } catch { 

      finishRecording(success: false) 
     } 

     do { 

      try audioSession.setActive(true) 
      audioRecorder.record() 

      TIMERRRRR = Timer.scheduledTimer(timeInterval: 0.02, target: self, selector: #selector(ViewController.levelTimerCallback), userInfo: nil, repeats: true) 

     } catch { 

     } 

    } 

回答

5

兩個問題,我可以看到。

首先是您在功能levelTimerCallback中使用錯誤的頻道編號進行測試。你的測試應該是針對通道0.

另一個是-7的值其實非常大。 averagePower返回-160和0之間的浮點數。嘗試使用-160進行測試以開始並增大該值以降低靈敏度。

這會改變你的測試:

if audioRecorder.averagePower(forChannel: 1) > -160 { 
    ... 
} 

只有在輸入單通道和計數從0開始,您在您的來電audioRecorder.averagePower以後有這個權利。

要獲得線性比例,您需要進行插值。更改scale的值以更改範圍。 proportion將介於0和scale之間。

let lowerLimit: Float = -100.0 

func levelTimerCallback(timer:Timer) { 

    audioRecorder.updateMeters() 

    let power = audioRecorder.averagePower(forChannel: 0) 
    if power > lowerLimit { 
     // proportion will have a value between 0 and scale 
     let scale: Float = 10.0 
     let proportion = -scale * (power - lowerLimit)/lowerLimit 
    } 
} 

編輯:固定比例計算

+0

我添加的東西,我認爲是接近正確答案。 –

+0

但你可以檢查編輯的代碼的一個問題? –

+0

如果您的比例介於0和1之間,那對我來說就好了。 –