IOS 通过麦克风检测声音分贝


在iphone真机上测的数据始始终没有变化, 在模拟器上是可以的,折腾了半天,终于搜索找到解决方法,在代码中添加

[[AVAudioSession sharedInstance]
        setCategory: AVAudioSessionCategoryPlayAndRecord error: nil];



1. 开发环境xocde5.1.1 , IOS sdk7.1

2.  引入框架:AVFoundation.framework

3.  部分源码如下:

#import "MicBlowViewController.h"

@implementation MicBlowViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    
     /* 必须添加这句话,否则在模拟器可以,在真机上获取始终是0  */
    [[AVAudioSession sharedInstance]
        setCategory: AVAudioSessionCategoryPlayAndRecord 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: 1 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 = -80.0f; // 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            = 2.0f;
        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(), ^{
        [_textLabel setText:[NSString stringWithFormat:@"%f", level*120]];
    });
}


- (void)dealloc {
    [levelTimer release];
    [recorder release];
    [_textLabel release];
    [_cLabel release];
    [super dealloc];
}

@end


评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值