录音和播放音乐使用的是同一个框架,都是iOS系统提供的AVFoundation.framwork

首先,还是创建项目  

ios录音并获取实时分贝大小 录音 ios_Power

起名:TestAVFoundationRecorder

ios录音并获取实时分贝大小 录音 ios_ios录音并获取实时分贝大小_02

接下来 导入AVFoundation.framwork

具体操作参照上一节

完成后项目目录如下

ios录音并获取实时分贝大小 录音 ios_Power_03

打开项目默认生成ViewController.m 添加代码

导入头文件


1. #import <AVFoundation/AVFoundation.h>


创建变量

1. @property (nonatomic,strong) AVAudioRecorder *audioRecorder;//音频录音机  
2. @property (nonatomic,strong) AVAudioPlayer *audioPlayer;//音频播放器,用于播放录音文件  
3. @property (nonatomic,strong) NSTimer *timer;//录音声波监控(注意这里暂时不对播放进行监控)  
4.   
5. @property (strong, nonatomic) UIButton *record;//开始录音  
6. @property (strong, nonatomic) UIButton *pause;//暂停录音  
7. @property (strong, nonatomic) UIButton *resume;//恢复录音  
8. @property (strong, nonatomic) UIButton *stop;//停止录音  
9. @property (strong, nonatomic) UIProgressView *audioPower;//音频波动


初始化界面

1. - (void)viewDidLoad {  
2. super viewDidLoad];  
3. // Do any additional setup after loading the view, typically from a nib.  
4.       
5.  alloc]initWithFrame:CGRectMake(10, 300, 60, 36)];  
6.  setTitle:@"录音" forState:UIControlStateNormal];  
7.  setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];  
8.  addTarget:self action:@selector(recordClick:) forControlEvents:UIControlEventTouchUpInside];  
9. self.view addSubview:_record];  
10.       
11.  alloc]initWithFrame:CGRectMake(80, 300, 60, 36)];  
12.  setTitle:@"暂停" forState:UIControlStateNormal];  
13.  setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];  
14.  addTarget:self action:@selector(pauseClick:) forControlEvents:UIControlEventTouchUpInside];  
15. self.view addSubview:_pause];  
16.       
17.  alloc]initWithFrame:CGRectMake(150, 300, 60, 36)];  
18.  setTitle:@"恢复" forState:UIControlStateNormal];  
19.  setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];  
20.  addTarget:self action:@selector(resumeClick:) forControlEvents:UIControlEventTouchUpInside];  
21. self.view addSubview:_resume];  
22.       
23.  alloc]initWithFrame:CGRectMake(220, 300, 60, 36)];  
24.  setTitle:@"停止" forState:UIControlStateNormal];  
25.  setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];  
26.  addTarget:self action:@selector(stopClick:) forControlEvents:UIControlEventTouchUpInside];  
27. self.view addSubview:_stop];  
28.       
29.       
30.  alloc] initWithProgressViewStyle: UIProgressViewStyleDefault];  
31. .frame=CGRectMake(0, 100, self.view.bounds.size.width, 36);  
32. self.view addSubview:_audioPower];  
33.       
34. self setAudioSession];  
35. }



创建一个常量作为录音文件的名称


1. #define kRecordAudioFile @"myRecord.caf"

最后我们实现一下 个个按钮点击之后的动作  以及录音等等 


1. #pragma mark - 私有方法  
2. /**
3.  *  设置音频会话
4.  */  
5. -(void)setAudioSession{  
6. AVAudioSession *audioSession=[AVAudioSession sharedInstance];  
7. //设置为播放和录音状态,以便可以在录制完之后播放录音  
8.  setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];  
9.  setActive:YES error:nil];  
10. }  
11.   
12. /**
13.  *  取得录音文件保存路径
14.  *
15.  *  @return 录音文件路径
16.  */  
17. -(NSURL *)getSavePath{  
18. NSString *urlStr=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];  
19.       
20. NSFileManager *fileManager = [NSFileManager defaultManager];  
21.       
22.       
23. if(![fileManager fileExistsAtPath:urlStr]) //如果不存在  
24.           
25.     {  
26. @"xxx.txt is not exist");  
27. else{  
28. @"xxx.txt is  exist");  
29.     }  
30.       
31.       
32.  stringByAppendingPathComponent:kRecordAudioFile];  
33. @"file path:%@",urlStr);  
34. NSURL *url=[NSURL fileURLWithPath:urlStr];  
35. return url;  
36. }  
37.   
38. ///var/mobile/Applications/F0CCA9DC-FFBE-4701-8396-2E6EB9509292/Documents/myRecord.caf  
39. ///var/mobile/Applications/F0CCA9DC-FFBE-4701-8396-2E6EB9509292/Documents/myRecord.caf  
40. /**
41.  *  取得录音文件设置
42.  *
43.  *  @return 录音设置
44.  */  
45. -(NSDictionary *)getAudioSetting{  
46. NSMutableDictionary *dicM=[NSMutableDictionary dictionary];  
47. //设置录音格式  
48.  setObject:@(kAudioFormatLinearPCM) forKey:AVFormatIDKey];  
49. //设置录音采样率,8000是电话采样率,对于一般录音已经够了  
50.  setObject:@(8000) forKey:AVSampleRateKey];  
51. //设置通道,这里采用单声道  
52.  setObject:@(1) forKey:AVNumberOfChannelsKey];  
53. //每个采样点位数,分为8、16、24、32  
54.  setObject:@(8) forKey:AVLinearPCMBitDepthKey];  
55. //是否使用浮点数采样  
56.  setObject:@(YES) forKey:AVLinearPCMIsFloatKey];  
57. //....其他设置等  
58. return dicM;  
59. }  
60.   
61. /**
62.  *  获得录音机对象
63.  *
64.  *  @return 录音机对象
65.  */  
66. -(AVAudioRecorder *)audioRecorder{  
67. if (!_audioRecorder) {  
68. //创建录音文件保存路径  
69. NSURL *url=[self getSavePath];  
70. //创建录音格式设置  
71. NSDictionary *setting=[self getAudioSetting];  
72. //创建录音机  
73. NSError *error=nil;  
74.  alloc]initWithURL:url settings:setting error:&error];  
75. .delegate=self;  
76. .meteringEnabled=YES;//如果要监控声波则必须设置为YES  
77. if (error) {  
78. @"创建录音机对象时发生错误,错误信息:%@",error.localizedDescription);  
79. return nil;  
80.         }  
81.     }  
82. return _audioRecorder;  
83. }  
84.   
85. /**
86.  *  创建播放器
87.  *
88.  *  @return 播放器
89.  */  
90. -(AVAudioPlayer *)audioPlayer{  
91. if (!_audioPlayer) {  
92. NSURL *url=[self getSavePath];  
93. NSError *error=nil;  
94.  alloc]initWithContentsOfURL:url error:&error];  
95. .numberOfLoops=0;  
96.  prepareToPlay];  
97. if (error) {  
98. @"创建播放器过程中发生错误,错误信息:%@",error.localizedDescription);  
99. return nil;  
100.         }  
101.     }  
102. return _audioPlayer;  
103. }  
104.   
105. /**
106.  *  录音声波监控定制器
107.  *
108.  *  @return 定时器
109.  */  
110. -(NSTimer *)timer{  
111. if (!_timer) {  
112.  scheduledTimerWithTimeInterval:0.1f target:self selector:@selector(audioPowerChange) userInfo:nil repeats:YES];  
113.     }  
114. return _timer;  
115. }  
116.   
117. /**
118.  *  录音声波状态设置
119.  */  
120. -(void)audioPowerChange{  
121. self.audioRecorder updateMeters];//更新测量值  
122. float power= [self.audioRecorder averagePowerForChannel:0];//取得第一个通道的音频,注意音频强度范围时-160到0  
123. 1.0/160.0)*(power+160.0);  
124. self.audioPower setProgress:progress];  
125. }  
126.   
127. #pragma mark - UI事件  
128. /**
129.  *  点击录音按钮
130.  *
131.  *  @param sender 录音按钮
132.  */  
133.   
134. - (void)recordClick:(UIButton *)sender {  
135. //    if (![self.audioPlayer isPlaying]) {  
136. //        [self.audioPlayer play];  
137. //    }  
138. //  
139. if (![self.audioRecorder isRecording]) {  
140. self.audioRecorder record];//首次使用应用时如果调用record方法会询问用户是否允许使用麦克风  
141. self.timer.fireDate=[NSDate distantPast];  
142.     }  
143. }  
144.   
145. /**
146.  *  点击暂定按钮
147.  *
148.  *  @param sender 暂停按钮
149.  */  
150. - (void)pauseClick:(UIButton *)sender {  
151. if ([self.audioRecorder isRecording]) {  
152. self.audioRecorder pause];  
153. self.timer.fireDate=[NSDate distantFuture];  
154.     }  
155. }  
156.   
157. /**
158.  *  点击恢复按钮
159.  *  恢复录音只需要再次调用record,AVAudioSession会帮助你记录上次录音位置并追加录音
160.  *
161.  *  @param sender 恢复按钮
162.  */  
163. - (void)resumeClick:(UIButton *)sender {  
164. self recordClick:sender];  
165. }  
166.   
167. /**
168.  *  点击停止按钮
169.  *
170.  *  @param sender 停止按钮
171.  */  
172. - (void)stopClick:(UIButton *)sender {  
173. self.audioRecorder stop];  
174. self.timer.fireDate=[NSDate distantFuture];  
175. self.audioPower.progress=0.0;  
176. }  
177.   
178. #pragma mark - 录音机代理方法  
179. /**
180.  *  录音完成,录音完成后播放录音
181.  *
182.  *  @param recorder 录音机对象
183.  *  @param flag     是否成功
184.  */  
185. -(void)audioRecorderDidFinishRecording:(AVAudioRecorder *)recorder successfully:(BOOL)flag{  
186. if (![self.audioPlayer isPlaying]) {  
187. self.audioPlayer play];  
188.     }  
189. @"录音完成!");  
190. }

到此 我们基本实现了功能

运行项目看看 

ios录音并获取实时分贝大小 录音 ios_#pragma_04

点击录音 看看 是不是 可以是用来 。点击停止之后录音结束并且自动开发播放录音