如何使用avaudiorecorder制作音频表级别

pan*_*kaj 13 iphone

我正在尝试使用av​​audiorecorder录制用户语音时创建音频表级别.在这方面有人可以帮助我吗?

Tom*_*Tom 16

实际上,代码非常简单,因为AVAudioPlayer和AVAudioRecorder已经内置了方法来帮助您.我的方法是这样的:

  • 使重复调用-updateMetersaveragePowerForChannel:&peakPowerForChannel:方法和调用一个委托方法来通知所述控制对象

例:

NSOperationQueue *queue=[[NSOperationQueue alloc] init];
NSInvocationOperation *operation=[[NSInvocationOperation alloc] initWithTarget:self selector:@selector(updateMeter) object:nil];
[queue addOperation: operation];
Run Code Online (Sandbox Code Playgroud)

-(void)updateMeter
{
  do {
      //don't forget:
      [recorder updateMeters];
       self.averagePower   = [recorder averagePowerForChannel:0];
       self.peakPower      = [recorder peakPowerForChannel:0];

       // we don't want to surprise a ViewController with a method call
       // not in the main thread
      [self.delegate performSelectorOnMainThread: @selector(meterLevelsDidUpdate:) withObject:self waitUntilDone:NO];
      [NSThread sleepForTimeInterval:.05]; // 20 FPS
     }while(someCondition);
}
Run Code Online (Sandbox Code Playgroud)

如果View Controller实现了该meterLevelsDidUpdate:方法,则可以使用此方法更新Level Meter.

  • 创建一个UIView子类,其子视图根据平均值或峰值更改其高度.调整味道.

  • 非常有帮助,谢谢.像我这样的新手需要记住设置meteringEnabled = YES. (3认同)
  • 你知道它的时间范围是什么吗?自上次`updateMeters`以来它是否选择峰值,在你的情况下0.05秒之前?当我想从全时间范围内选择最大值时怎么办?http://stackoverflow.com/questions/30866132/time-range-for-peakpowerforchannel-or-averagepowerforchannel (2认同)

Mat*_*jan 7

很简单,你可以使用NSTimer:

- (void)startAudioMetering {
    self.meterTimer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(updateAudioMeter)userInfo:nil repeats:YES];
}

- (void)stopAudioMetering {
    [self.meterTimer invalidate];
}

- (void)updateAudioMeter { //called by timer
    // audioRecorder being your instance of AVAudioRecorder
    [self.audioRecorder updateMeters];
    self.dBLevel = [self.audioRecorder averagePowerForChannel:0];
}
Run Code Online (Sandbox Code Playgroud)

警告:在创建AVAudioRecorder实例时,您必须在调用prepareToRecord或记录后调用meteringEnabled,否则它将不会更新计时器:

[self.audioRecorder prepareToRecord];
self.audioRecorder.meteringEnabled = YES;
Run Code Online (Sandbox Code Playgroud)