Tom*_*Tom 16
实际上,代码非常简单,因为AVAudioPlayer和AVAudioRecorder已经内置了方法来帮助您.我的方法是这样的:
-updateMeters和averagePowerForChannel:&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.
很简单,你可以使用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)
| 归档时间: |
|
| 查看次数: |
12143 次 |
| 最近记录: |