- (void)viewDidLoad
{
[super viewDidLoad];
[self.view addSubview:self.labelVoice];
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionDefaultToSpeaker| AVAudioSessionCategoryOptionMixWithOthers |AVAudioSessionCategoryOptionAllowBluetooth error:nil];/*不需要保存录音文件*/NSURL*url = [NSURL fileURLWithPath:@"/dev/null"];
NSDictionary*settings =[NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithFloat:44100.0], AVSampleRateKey,
[NSNumber numberWithInt: kAudioFormatAppleLossless], AVFormatIDKey,
[NSNumber numberWithInt:2], AVNumberOfChannelsKey,
[NSNumber numberWithInt: AVAudioQualityMax], AVEncoderAudioQualityKey,
nil];
NSError*error;
recorder= [[AVAudioRecorder alloc] initWithURL:url settings:settings error:&error];if(recorder)
{
[recorder prepareToRecord];
recorder.meteringEnabled=YES;
[recorder record];
levelTimer= [NSTimer scheduledTimerWithTimeInterval: 0.3target: self selector: @selector(levelTimerCallback:) userInfo: nil repeats: YES];
}else{
NSLog(@"%@", [error description]);
}
}/*该方法确实会随环境音量变化而变化,但具体分贝值是否准确暂时没有研究*/
- (void)levelTimerCallback:(NSTimer *)timer {
[recorder updateMeters];float level; //The linear 0.0 .. 1.0 value we need.
float minDecibels = -60.0f; //use -80db Or use -60dB, which I measured in a silent room.
float decibels = [recorder averagePowerForChannel:0];if (decibels
{
level= 0.0f;
}else if (decibels >= 0.0f)
{
level= 1.0f;
}else{float root = 5.0f; //modified level from 2.0 to 5.0 is neast to real test
float minAmp = powf(10.0f, 0.05f *minDecibels);float inverseAmpRange = 1.0f / (1.0f -minAmp);float amp = powf(10.0f, 0.05f *decibels);float adjAmp = (amp - minAmp) *inverseAmpRange;
level= powf(adjAmp, 1.0f /root);
}/*level 范围[0 ~ 1], 转为[0 ~120] 之间*/dispatch_async(dispatch_get_main_queue(),^{
NSLog(@"voice updated :%f",level * 120);
self.layerVoice.frame= CGRectMake(0, 0, level * 120, 50);
});
}