ios录音功能实现
来源:互联网 发布:python 写入环境变量 编辑:程序博客网 时间:2024/05/16 09:03
实现功能主要为:按下按钮开始录音,时间条开始计时,松开停止录音,时间条停止计时,滑开手指放弃录音。保存录音文件到本地document文件中。
一、导入头文件和代理
#import <AVFoundation/AVFoundation.h>
<AVAudioRecorderDelegate>
二、在.h文件中声明
{ MBProgressHUD *HUD; UILabel *noticeLabel;//提示标签}@property (nonatomic,strong) UIView *recordView;//录音界面@property (nonatomic,strong) UIButton *recordBtn;//录音按钮@property (nonatomic,strong) UILabel *timeLabel; //录音计时@property (nonatomic,strong) AVAudioRecorder *audioRecorder;//音频录音机@property (nonatomic,assign) NSInteger countNum;//录音计时(秒)@property (nonatomic,strong) NSTimer *timer1; //控制录音时长显示更新@property (nonatomic,copy) NSString *cafPathStr;
三、正文
在.m文件中添加
#define margin 15#define kSandboxPathStr [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject]#define kCafFileName @"myRecord.caf"/** *存放所有的音乐播放器 */static NSMutableDictionary *_musices;
//页面布局- (void)setupView{ CGFloat recordH = SCREEN_HEIGHT * 0.4; CGFloat availH = recordH - margin * 4; _recordView = [[UIView alloc]initWithFrame:CGRectMake(0, SCREEN_HEIGHT - recordH, SCREEN_WIDTH, recordH)]; _recordView.backgroundColor = [UIColor whiteColor]; [self addSubview:_recordView]; CGFloat timeH = availH * 0.2; CGFloat btnH = availH * 0.7; CGFloat noticeH = availH * 0.1; self.timeLabel.frame = CGRectMake(0, margin, SCREEN_WIDTH, timeH); self.recordBtn.frame = CGRectMake((SCREEN_WIDTH - btnH)*0.5, CGRectGetMaxY(self.timeLabel.frame) + margin, btnH, btnH); self.recordBtn.layer.cornerRadius = self.recordBtn.frame.size.width * 0.5; [self.recordBtn.layer setMasksToBounds:YES]; [self.recordBtn addTarget:self action:@selector(startRecordNotice) forControlEvents:UIControlEventTouchDown]; [self.recordBtn addTarget:self action:@selector(stopRecordNotice) forControlEvents:UIControlEventTouchUpInside]; [self.recordBtn addTarget:self action:@selector(cancelRecordNotice) forControlEvents:UIControlEventTouchUpOutside]; self.closeBtn.frame = CGRectMake(SCREEN_WIDTH - 25, 5, 20, 20); [_closeBtn addTarget:self action:@selector(closeBtnClick) forControlEvents:UIControlEventTouchUpInside]; [_recordView addSubview:self.timeLabel]; [_recordView addSubview:self.recordBtn]; [_recordView addSubview:self.closeBtn]; noticeLabel = [[UILabel alloc]init]; noticeLabel.frame = CGRectMake(0, recordH - noticeH - margin, SCREEN_WIDTH, noticeH); noticeLabel.textAlignment = NSTextAlignmentCenter; noticeLabel.textColor = [UIColor lightGrayColor]; noticeLabel.font = [UIFont systemFontOfSize:14]; noticeLabel.text = @"按住不放录制语音"; [_recordView addSubview:noticeLabel]; self.timeLabel2.text = @""; self.cafPathStr = [kSandboxPathStr stringByAppendingPathComponent:kCafFileName];}-(UIButton *)closeBtn{ if (!_closeBtn) { _closeBtn = [[UIButton alloc]init]; [_closeBtn setBackgroundImage:[UIImage imageNamed:@"infoClose.png"] forState:UIControlStateNormal]; } return _closeBtn;}-(UILabel *)timeLabel{ if (!_timeLabel) { _timeLabel = [[UILabel alloc]init]; _timeLabel.textAlignment = NSTextAlignmentCenter; _timeLabel.font = [UIFont fontWithName:@"HelveticaNeue-Thin" size:42]; _timeLabel.text = @"00:00"; _timeLabel.textColor = MF_ColorFromRGB(215, 155, 252); } return _timeLabel;}- (UIButton *)recordBtn{ if (!_recordBtn) { _recordBtn = [[UIButton alloc]init]; _recordBtn.backgroundColor = [UIColor clearColor]; [_recordBtn setBackgroundImage:[UIImage imageNamed:@"record_norm"] forState:UIControlStateNormal]; [_recordBtn setBackgroundImage:[UIImage imageNamed:@"record_high"] forState:UIControlStateHighlighted];// _recordBtn.userInteractionEnabled = YES;//方便添加长按手势 } return _recordBtn;}
//点击关闭页面按钮- (void)closeBtnClick{ [self removeFromSuperview];}
#pragma mark - 录音方法//改变录音时间- (void)changeRecordTime{ self.countNum += 1; NSInteger min = self.countNum/60; NSInteger sec = self.countNum - min * 60; // NSInteger sec = self.countNum; self.timeLabel.text = [NSString stringWithFormat:@"%02ld:%02ld",(long)min,(long)sec]; if (sec == 59) { [self stopRecordNotice]; }}- (void)startRecordNotice{ self.timeLabel2.text = @""; [self stopMusicWithUrl:[NSURL URLWithString:self.cafPathStr]]; if ([self.audioRecorder isRecording]) { [self.audioRecorder stop]; }// NSLog(@"----------开始录音----------"); [self deleteOldRecordFile];// 如果不删掉,会在原文件基础上录制;虽然不会播放原来的声音,但是音频长度会是录制的最大长度。 AVAudioSession *audioSession=[AVAudioSession sharedInstance]; [audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error:nil]; if (![self.audioRecorder isRecording]){// {0--停止、暂停,1-录制中 [self.audioRecorder record];// 首次使用应用时如果调用record方法会询问用户是否允许使用麦克风 self.countNum = 0; NSTimeInterval timeInterval =1 ;// 0.1s self.timer1 = [NSTimer scheduledTimerWithTimeInterval:timeInterval target:self selector:@selector(changeRecordTime) userInfo:nil repeats:YES]; [self.timer1 fire]; } noticeLabel.text = @"脱离按钮,松开手指放弃录音";}- (void)stopRecordNotice{// NSLog(@"----------结束录音----------"); [self.audioRecorder stop]; [self.timer1 invalidate];// 计算文件大小 long long fileSize = [self fileSizeAtPath:self.mp3PathStr]/1024.0; NSString *fileSizeStr = [NSString stringWithFormat:@"%lld",fileSize]; self.timeLabel2.text = [NSString stringWithFormat:@"%ld \" %@kb ",(long)self.countNum,fileSizeStr]; self.timeLabel.text = @"01:00"; [self.delegate getRecordData:self.mp3PathStr type:@"2" fileName:kMp3FileName]; [self removeFromSuperview];}- (void)cancelRecordNotice{// NSLog(@"----------取消录音----------"); [self.audioRecorder stop]; [self.timer1 invalidate]; // 计算文件大小 long long fileSize = [self fileSizeAtPath:self.mp3PathStr]/1024.0; NSString *fileSizeStr = [NSString stringWithFormat:@"%lld",fileSize]; self.timeLabel2.text = [NSString stringWithFormat:@"%ld \" %@kb ",(long)self.countNum,fileSizeStr]; self.timeLabel.text = @"00:00"; noticeLabel.text = @"按住不放录制语音";}
//删除旧录音缓存-(void)deleteOldRecordFile{ NSFileManager* fileManager=[NSFileManager defaultManager]; BOOL blHave=[[NSFileManager defaultManager] fileExistsAtPath:self.cafPathStr]; if (!blHave) {// NSLog(@"不存在"); return ; }else {// NSLog(@"存在"); BOOL blDele= [fileManager removeItemAtPath:self.cafPathStr error:nil]; if (blDele) {// NSLog(@"删除成功"); }else {// NSLog(@"删除失败"); } }}
#pragma mark - Getter/** * 获得录音机对象 * * @return 录音机对象 */-(AVAudioRecorder *)audioRecorder{ if (!_audioRecorder) { //创建录音文件保存路径 NSURL *url=[NSURL URLWithString:self.cafPathStr]; //创建录音格式设置 NSDictionary *setting=[self getAudioSetting]; //创建录音机 NSError *error=nil; _audioRecorder=[[AVAudioRecorder alloc]initWithURL:url settings:setting error:&error]; _audioRecorder.delegate=self; _audioRecorder.meteringEnabled=YES;//如果要监控声波则必须设置为YES if (error) { NSLog(@"创建录音机对象时发生错误,错误信息:%@",error.localizedDescription); return nil; } } return _audioRecorder;}/** * 取得录音文件设置 * * @return 录音设置 */-(NSDictionary *)getAudioSetting{ //LinearPCM 是iOS的一种无损编码格式,但是体积较为庞大 //录音设置 NSMutableDictionary *recordSettings = [[NSMutableDictionary alloc] init]; //录音格式 无法使用 [recordSettings setValue :[NSNumber numberWithInt:kAudioFormatLinearPCM] forKey: AVFormatIDKey]; //采样率 [recordSettings setValue :[NSNumber numberWithFloat:11025.0] forKey: AVSampleRateKey];//44100.0 //通道数 [recordSettings setValue :[NSNumber numberWithInt:2] forKey: AVNumberOfChannelsKey]; //线性采样位数 //[recordSettings setValue :[NSNumber numberWithInt:16] forKey: AVLinearPCMBitDepthKey]; //音频质量,采样质量 [recordSettings setValue:[NSNumber numberWithInt:AVAudioQualityMin] forKey:AVEncoderAudioQualityKey]; return recordSettings;}
/** *停止播放音乐文件 */- (void)stopMusicWithUrl:(NSURL *)fileUrl{ if (!fileUrl) return;//如果没有传入文件名,那么就直接返回 //1.取出对应的播放器 AVAudioPlayer *player=[self musices][fileUrl]; //2.停止 if ([player isPlaying]) { [player stop];// NSLog(@"播放结束:%@--------",fileUrl); } if ([[self musices].allKeys containsObject:fileUrl]) { [[self musices] removeObjectForKey:fileUrl]; }}
//单个文件的大小- (long long) fileSizeAtPath:(NSString*)filePath{ NSFileManager* manager = [NSFileManager defaultManager]; if ([manager fileExistsAtPath:filePath]){ return [[manager attributesOfItemAtPath:filePath error:nil] fileSize]; }else{ NSLog(@"计算文件大小:文件不存在"); } return 0;}
PS:ios音频播放实现http://blog.csdn.net/fantasy_jun/article/details/77895525
阅读全文
1 0
- iOS实现录音功能
- ios录音功能实现
- ios录音功能的实现
- iOS 录音功能的实现
- ios录音功能的实现
- iOS 录音功能的实现
- iOS录音功能的实现
- iOS录音功能的实现
- iOS录音功能的实现
- ios录音功能的实现
- IOS-IOS录音功能的实现
- iOS下录音功能的实现
- iOS实现录音与播放功能
- ios-录音功能的简单实现
- IOS-录音功能
- IOS-录音功能
- IOS-录音功能
- IOS-录音功能
- 抽象类与接口的区别
- JavaScript内存泄露的4种方式及如何避免
- android view自带边距的对齐问题
- viewpage中对于fragment的生命周期
- react(三)组件内部状态state使用方式
- ios录音功能实现
- hibernate的资料汇总
- ROS如何入门
- solr学习之路2---Field和FieldType的介绍
- pycharm快捷键
- python链接Mysql读取中文乱码
- 任务繁忙的ACM协会
- Masonry的约束布局,scrollView与cell的自动算高
- 8. String to Integer (atoi)