2017-04-03 61 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

2つの問題を。

最初に、関数levelTimerCallbackで間違ったチャンネル番号でテストしていることです。あなたのテストはチャネル0にする必要があります。

もう1つは、-7の値が実際には非常に大きいことです。 averagePowerは、-160と0の間の浮動小数点数を返します。-160に対してテストを行い、それを増やして感度を下げてください。そこ入力のための唯一のシングルチャネルであるとカウントは0から始まります

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

あなたは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

編集したコードを確認するには1つの問題がありますか? –

+0

あなたの割合が0と1の間であれば、それは私には大丈夫です。 –

関連する問題