c语言用麦克风检测环境噪音分贝,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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值