2017-04-03 1 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을 기준으로 테스트를 시작하고 감도를 줄이려면이 값을 늘립니다. 이 입력을위한 단 하나의 채널과 카운트가 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

하지만 한 가지 문제는 편집 된 코드를 확인할 수 있습니까? –

+0

귀하의 비율이 0과 1 사이라면, 저에게는 괜찮아 보입니다. –

관련 문제