iOS录音及播放全解

//
//  ViewController.m
//  录音与播放
//
//  Created by 张璟冰 on 2020/3/29.
//  Copyright © 2020 张璟冰. All rights reserved.
//#import "ViewController.h"
#import <AVFoundation/AVFoundation.h>
@interface ViewController ()<AVAudioRecorderDelegate>{UILabel *timeLabel;float time;//保存我们录音录了多久
}
@property(nonatomic,strong)AVAudioRecorder *audioRecorder;//录音器
@property (nonatomic,strong) NSString *mp3Path;
@property (nonatomic,strong) NSString *cafPath;
@property (nonatomic, strong) NSTimer *timer;//定时器
@property (nonatomic, strong) AVAudioPlayer *player; //播放器
@end@implementation ViewController
#pragma mark  第三步 录音器的懒加载
- (AVAudioRecorder *)audioRecorder
{if (!_audioRecorder){//7.0第一次运行会提示,是否允许使用麦克风AVAudioSession *session = [AVAudioSession sharedInstance];NSError *sessionError;//AVAudioSessionCategoryPlayAndRecord用于录音和播放[session setCategory:AVAudioSessionCategoryPlayAndRecord error:&sessionError];if(session == nil)NSLog(@"Error creating session: %@", [sessionError description]);else[session setActive:YES error:nil];//创建录音文件保存路径NSURL *url = [self getSavePath];//创建录音格式设置NSDictionary *setting = [self getAudioSetting];//创建录音机NSError *error=nil;_audioRecorder = [[AVAudioRecorder alloc]initWithURL:url settings:setting error:&error];_audioRecorder.delegate=self;_audioRecorder.meteringEnabled=YES;//如果要监控声波则必须设置为YES[_audioRecorder prepareToRecord];if (error){NSLog(@"创建录音机对象时发生错误,错误信息:%@",error.localizedDescription);return nil;}}return _audioRecorder;
}
/***  取得录音文件保存路径**  @return 录音文件路径*/
-(NSURL *)getSavePath
{//iPhone会为每一个应用程序生成一个私有目录,这个目录位于/user/.../Application下//并会随机生成一个数字字母串作为目录名//通常使用Documents目录进行数据持久化的保存//  在Documents目录下创建一个名为AudioData的文件夹、NSString *path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject] stringByAppendingPathComponent:@"AudioData"];NSLog(@"%@",path);NSFileManager *fileManager = [NSFileManager defaultManager];BOOL isDir = FALSE;BOOL isDirExist = [fileManager fileExistsAtPath:path isDirectory:&isDir];if(!(isDirExist && isDir)){BOOL bCreateDir = [fileManager createDirectoryAtPath:path withIntermediateDirectories:YES attributes:nil error:nil];if(!bCreateDir){NSLog(@"创建文件夹失败!");}NSLog(@"创建文件夹成功,文件路径%@",path);}NSString *fileName = @"record";NSString *cafFileName = [NSString stringWithFormat:@"%@.caf", fileName];NSString *mp3FileName = [NSString stringWithFormat:@"%@.mp3", fileName];//拼接路径NSString *cafPath = [path stringByAppendingPathComponent:cafFileName];NSString *mp3Path = [path stringByAppendingPathComponent:mp3FileName];self.mp3Path = mp3Path;self.cafPath = cafPath;NSLog(@"file path:%@",cafPath);NSURL *url=[NSURL fileURLWithPath:cafPath];return url;
}
/***  取得录音文件设置**  @return 录音设置*/
- (NSDictionary *)getAudioSetting
{NSMutableDictionary *dicM = [NSMutableDictionary dictionary];[dicM setObject:@(kAudioFormatLinearPCM) forKey:AVFormatIDKey];
//    [dicM setObject:@(ETRECORD_RATE) forKey:AVSampleRateKey];[dicM setObject:@(2) forKey:AVNumberOfChannelsKey];[dicM setObject:@(16) forKey:AVLinearPCMBitDepthKey];[dicM setObject:[NSNumber numberWithInt:AVAudioQualityMin] forKey:AVEncoderAudioQualityKey];return dicM;
}
- (void)viewDidLoad
{[super viewDidLoad];UIButton *btn = [[UIButton alloc]initWithFrame:CGRectMake(0, 0, 100, 100)];btn.tag = 10000;[btn setTitle:@"开始录音" forState:UIControlStateNormal];[btn setTitle:@"停止录音" forState:UIControlStateSelected];[btn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];btn.backgroundColor = [UIColor whiteColor];[btn addTarget:self action:@selector(recordClick:) forControlEvents:UIControlEventTouchUpInside];[self.view addSubview:btn];UIButton *btn2 = [[UIButton alloc]initWithFrame:CGRectMake(120, 0, 100, 100)];btn2.tag = 10001;[btn2 setTitle:@"播放录音" forState:UIControlStateNormal];[btn2 setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];btn2.backgroundColor = [UIColor whiteColor];[btn2 addTarget:self action:@selector(play:) forControlEvents:UIControlEventTouchUpInside];[self.view addSubview:btn2];//时间timeLabel = [[UILabel alloc]initWithFrame:CGRectMake(0, 200, 100, 30)];timeLabel.text = @"录音时长";timeLabel.font = [UIFont systemFontOfSize:16];timeLabel.textColor = [UIColor blackColor];[self.view addSubview:timeLabel];
}
#pragma mark 播放录音
-(void)play:(UIButton *)sender
{if ([self.player isPlaying])return;self.player = [[AVAudioPlayer alloc]initWithData:[NSData dataWithContentsOfFile:self.cafPath] error:nil];[self.player play];
}
#pragma mark 第四步 开始/结束录音点击、播放点击
-(void)recordClick:(UIButton *)sender
{sender.selected = !sender.selected;if (sender.selected){//开始录音[self startRecord];}else{//结束录音[self finishRecorded];}
}
//结束录音
- (void)finishRecorded
{//使用系统自带录音机if ([self.audioRecorder isRecording]){NSLog(@"完成");[self destoryTimer];[self.audioRecorder stop];//停止工作}if (time < 1){NSLog(@"录音时间过短!");//清空录音内容return;}//进行录音格式的转码成mp3格式、提交网络上传//Lametime = 0;timeLabel.text = @"点击录音";}
//开始录音
- (void)startRecord
{// 重置录音机if (self.audioRecorder){self.audioRecorder = nil;time = 0;[self destoryTimer];}if (![self.audioRecorder isRecording]){AVAudioSession *session = [AVAudioSession sharedInstance];NSError *sessionError;//AVAudioSessionCategoryPlayAndRecord用于录音和播放[session setCategory:AVAudioSessionCategoryPlayAndRecord error:&sessionError];if(session == nil)NSLog(@"Error creating session: %@", [sessionError description]);else[session setActive:YES error:nil];//创建定时器方法,实时计算录音了几秒钟self.timer = [NSTimer scheduledTimerWithTimeInterval:1target:selfselector:@selector(record)userInfo:nilrepeats:YES];timeLabel.text = @"00:00";[self.audioRecorder record];//开始工作NSLog(@"录音开始");}else{NSLog(@"is  recording now  ....");}}
//   定时器方法--录音时间计算
- (void)record
{time = time+1;timeLabel.text = [self timeFormatted:(float)time];//假如一次性只能录180s,一般写倒计时提示if (time == 180){NSLog(@"%@",@"最多仅能录取180s");//结束录音UIButton *btn = [self.view viewWithTag:10000];btn.selected = !btn.selected;
//        [self finishRecorded];//调用录音结束[self.timer invalidate];self.timer = nil;
//        _recordGIFImg.hidden = YES;//关闭GIF图,这个图是一个光播图标)))
//        [_recordGIFImg stopAnimating];}
}
- (NSString *)timeFormatted:(NSInteger)totalSeconds
{NSInteger seconds = totalSeconds % 60;NSInteger minutes = (totalSeconds / 60) % 60;NSInteger hours = totalSeconds / 3600;if (hours <= 0){return [NSString stringWithFormat:@"%02ld:%02ld",(long)minutes, (long)seconds];}return [NSString stringWithFormat:@"%02ld:%02ld:%02ld",(long)hours, (long)minutes, (long)seconds];
}//销毁定时器
- (void)destoryTimer
{if (self.timer){[self.timer invalidate];//使其无效self.timer = nil;//置空NSLog(@"----- timer destory");}
}
@end

iOS录音及播放全解相关推荐

  1. Swift实现iOS录音与播放音频功能

    Swift实现iOS录音与播放音频功能 作用 AVPLayer:可以用来播放在线及本地音视频 AVAudioSession:音频会话,主要用来管理音频设置与硬件交互 使用时需要导入 #import & ...

  2. iOS开发--音频播放、录音、视频播放、拍照、视频录制

    概览 随着移动互联网的发展,如今的手机早已不是打电话.发短信那么简单了,播放音乐.视频.录音.拍照等都是很常用的功能.在iOS中对于多媒体的支持是非常强大的,无论是音视频播放.录制,还是对麦克风.摄像 ...

  3. iOS加载网页【全解】

    iOS加载网页目前有4种方式 UIWebView WKWebView Safari浏览器(app外部):openURL Safari浏览器(app内部):SFSafariViewController ...

  4. iOS录音和音频播放

    文章目录 简介 `AVAudioRecorder`录音 `AVAudioPlayer`播放音频文件. 简介 最近公司研发了一个语音识别的框架,但这个框架是后端识别,所以需要手机端录音,录音后将音频文件 ...

  5. iOS录音播放简例-AVFoundation

    iOS录音播放简例-AVFoundation 本例简单介绍一个demo,录制一段声音,再播放它,用的是AVFoundation框架. 一.添加AVFoundation框架,在.m文件中引入 #impo ...

  6. 苹果 ios 使用video 播放器,怎么禁止自动全屏

    苹果 ios 使用video 播放器,怎么禁止自动全屏 最近在做兼职,遇到两个小问题,记录下, ios系统怎么在微信中禁用video 全屏展示 在video标签中 增加 x5-video-player ...

  7. IOS AVFoundation的录音与播放

    这是我第一次撰写博客,大部分内容都来自网络,写的不对地方还请多多指教,如果有摘录的地方与原作略有相同还请谅解说明.请多多支持. 1,AVAudioSession的使用 AVAudioSession是一 ...

  8. 【HTML5】 Audio/Video全解(集合贴)

    [HTML5] Audio/Video全解(集合贴) 2015-03-17  chenh_doc 目录[-] 一.标签解读 二.Media对象方法和属性 三.Media JS事件 四.浏览器对音视频格 ...

  9. 生成对抗网络gan原理_中国首个“芯片大学”即将落地;生成对抗网络(GAN)的数学原理全解...

    开发者社区技术周刊又和大家见面了,萌妹子主播为您带来第三期"开发者技术联播".让我们一起听听,过去一周有哪些值得我们开发者关注的重要新闻吧. 中国首个芯片大学,南京集成电路大学即将 ...

  10. 卷积为什么如此强大?一文全解深度学习中的卷积

    卷积为什么如此强大?一文全解深度学习中的卷积 2018年05月10日 15:52:41 七月在线实验室 阅读数:17112 作者:Tim Dettmers(Understanding Convolut ...

最新文章

  1. flume bucketpath的bug一例
  2. Android图像变化
  3. CentOS 7——yum错误[Error: rpmdb open failed]解决方案
  4. python编写下载器可暂停_python 并发下载器实现方法示例
  5. 管理员获得所有权_在Windows 7中获得注册表项的所有权
  6. 表达式树练习实践:入门基础
  7. JAVA可阻塞队列-ArrayBlockingQueue
  8. SVN代码回滚命令之---svn up ./ -r 版本号---OK
  9. 使用java实现面向对象编程第二章_java面向对象编程——第二章 java基础语法
  10. 2021-2025年中国中压额定母线槽行业市场供需与战略研究报告
  11. 网易云信 web demo体验-会议
  12. DDR March系列算法整理
  13. 使用CSS实现国际象棋棋盘
  14. Unity3D开发之画墙、地面分割(户型绘制)
  15. 停车还能360全方位影像_新司机轻松,老司机上瘾,中大型SUV都少不了360°全景影像...
  16. 远程重启h3c路由器_H3C路由器简单命令
  17. win7鼠标右键无响应修复
  18. 项目开发团队分配管理软件总结
  19. mysql group top_Mysql group by 后取 top N 问题
  20. 【航线运输驾驶员理论考试】气象学

热门文章

  1. 天涯明月刀如何修改登录服务器,天涯明月刀手游体验服和正式服怎么切换方法介绍...
  2. Xcode9 LaunchScreen.storyboard 设置app启动图片
  3. 计算机二级报名省市,计算机二级报名通知:全国19省市报名时间及考试安排!...
  4. 全国计算机高新技术模块,全国计算机信息高新技术考试模块总表.doc
  5. Matlab lowess拟合,matlab拟合出曲面后,还需要对应的公式
  6. 手机app性能测试简介了解
  7. win下hadoop配置环境后cmd中报错
  8. 条形码、二维码、三维码解读
  9. MMKV_mmkv之基本介绍
  10. SaaSpace:25款最佳免费视频编辑软件工具