2017-04-03 262 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之间,那对我来说就好了。 –