还是和之前一样,我们可以先去搭建界面,这里其实我们也是和之前播放音乐和音效一样的做法,但是我们还需要去加的一个额外的功能就是如果分贝值小于某个值了,我们可以让它自动停止录音。也学习到了这个知识
这样能够去检测出一定的值的,我们的步骤一般是如下所示
1、打开分贝的检测 self.recorder.meteringEnabled = YES;
2、在录音的方法中进行分贝的循环检测,利用添加计时器的方法 [self updateMetering];也就是通过调用这个方法
如果不存在displayLink我们就去创建,然后添加到运行循环中
如果暂停了循环 就去打开
3、在暂停和停止录音的方法中我们需要去暂停循环
4、循环调用的方法,去根据分贝的大小来进行判断
先去更新分贝的信息 [self.recorder updateMeters];
获取分贝的信息 averagePowerForChannel通过单声道也就是传入0来获取
根据分贝的大小是否小于某个我们指定的值,如果小于的话计数就加一,如果2s钟都小于某个值就自动的取消录音
代码如下所示
//如果我们没有设置权限的话,这个时候会先输出-120
#import "ViewController.h"
#import <AVFoundation/AVFoundation.h>
/**
1、使用AVFoundation框架
2、使用录音对象
3、根据我们需要的需求去进行录音/暂停/停止
*/
@interface ViewController ()
@property (nonatomic ,strong)AVAudioRecorder *recorder;
@property (nonatomic ,strong)CADisplayLink *displayLink;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
//1、获取URL的地址,就是根据具体的文件名的路径,去获取URL
NSString * path = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES)[0]stringByAppendingPath
Component:@"recover.wav"];
//2、将path字符串转换成NSURL
NSURL * url = [NSURL fileURLWithPath:path];
NSLog(@"%@",path);
//3、配置设置的字典,如果传的是空就表示是高质量的,这里录音文本的质量我们可以自己去设置
NSMutableDictionary * settings = [NSMutableDictionary dictionaryWithCapacity:10];
//设置音频的采样率
settings[AVSampleRateKey] = @(500.0);
//设置音频的通道数
settings[AVNumberOfChannelsKey]=@(1);
//4、创建Error对象
NSError * __autoreleasing error;
//5、创建录音对象
AVAudioRecorder * recorder = [[AVAudioRecorder alloc]initWithURL:url settings:settings error:&error];
self.recorder = recorder;
if(error)
{
NSLog(@"%@",error);
}
//打开分贝的检测
self.recorder.meteringEnabled = YES;
//在真机运行,这个时候还需要一个seesion类,并且去制定分类为录音,如果不添加的话自动停止录音是不可以用的
AVAudioSession * session = [AVAudioSession sharedInstance];
[session setCategory:AVAudioSessionCategoryRecord error:nil];
}
//停止录音的时候会去生成录音文本
- (IBAction)stopRecord:(id)sender {
//停止录音
[self.recorder stop];
NSLog(@"停止录音");
self.displayLink.paused=YES;
}
- (IBAction)pauseRecord:(id)sender {
//暂停录音,录音文本并不会保存,需要去提醒用户保存,当调用self.recorder stop的方法就会去保存了
[self.recorder pause];
self.displayLink.paused=YES;
}
- (IBAction)startRecord:(id)sender {
//准备录音,如果保存的是同一个路径,再次去录音的话,就会去覆盖之前的文件
[self.recorder prepareToRecord];
//开始录音
[self.recorder record];
[self updateMetering];
}
#pragma mark 添加计时器
//通过计时器去监听分贝的变化
-(void)updateMetering
{
//判断有没有displayLink,如果没有就去创建
if(self.displayLink==nil)
{
//创建一个定时器,然后去执行我们指定的方法
self.displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(updateMeter)];
//添加到主运行循环中
[self.displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
}
//判断如果暂停了循环就去打开
if(self.displayLink.isPaused)
{
self.displayLink.paused=NO;
}
}
//在视图即将消失的时候去调用让定时器无效果
-(void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
//取消定时器
[self.displayLink invalidate];
}
//在这个方法中我们需要去根据分贝的大小来停止录音
-(void)updateMeter
{
//1、首先我们先要去获取分贝信息
[self.recorder updateMeters];
/**2、获取分贝信息 最大是0,最小值是-160,0分贝的返回值表示满刻度或最大功率;返回值为-160分贝表示最小功率(即接近静音)。如果提供给音频播放器的信号
超过了满量程,则返回值可能超过0(即,它可以进入正范围)。*/
CGFloat power = [self.recorder averagePowerForChannel:0];
//记录分贝小于-60的次数
static int number;
//displayLink,一般是1秒会调用60次,如果120次的调用都是小于某一个分贝值的话,那么就会自动停止
if(power<-60)
{
number++;
if(number/60>=2)
{
[self stopRecord:nil];
}
}
NSLog(@"%f",power);
}