一、全局变量声明
@interface ViewController ()
{
AVAudioRecorder *recorder;
NSTimer *levelTimer;
}
@property(nonatomic,strong)UILabel *labelVoice;
@property(nonatomic,strong)CALayer *layerVoice;
@end
二、功能部分
1、UI部分
- (UILabel *)labelVoice
{
if (!_labelVoice)
{
_labelVoice = [[UILabel alloc]initWithFrame:CGRectMake(50, 100, 120, 50)];
_labelVoice.backgroundColor = [UIColor orangeColor];
self.layerVoice = [CALayer layer];
self.layerVoice.backgroundColor = [[UIColor greenColor]CGColor];
self.layerVoice.frame = _labelVoice.bounds;
[_labelVoice.layer addSublayer:_layerVoice];
}
return _labelVoice;
}
2、功能部分
- (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.3 target: 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 < minDecibels)
{
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);
});
}