李洪强iOS开发之录音和播放实现
李洪强iOS开发之录音和播放实现









//首先导入框架后,导入头文件.以下内容为托控件,在storyboard中拖出两个按钮为录音和播放按钮
//创建一个UIViewController在.h文件中写
#import<UIKit/UIKit.h>
#import<AVFoundation/AVFoundation.h>
@interface ViewController : UIViewController
//录音存储路径
@property (nonatomic, strong)NSURL *tmpFile;
//录音
@property (nonatomic, strong)AVAudioRecorder*recorder;
//播放
@property (nonatomic, strong)AVAudioPlayer *player;
//录音状态(是否录音)
@property (nonatomic, assign)BOOL isRecoding;
@end
//在.m文件中写
#import "ViewController.h"
//添加代理
@interface ViewController ()<AVAudioPlayerDelegate>
//录音按钮
@property (weak, nonatomic) IBOutlet UIButton*recordButton;
//播放按钮
@property (weak, nonatomic) IBOutlet UIButton*playButton;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
//刚打开的时候录音状态为不录音
self.isRecoding = NO;
//播放按钮不能被点击
[self.playButton setEnabled:NO];
//播放按钮设置成半透明
self.playButton.titleLabel.alpha = 0.5;
//创建临时文件来存放录音文件
self.tmpFile = [NSURL fileURLWithPath:[NSTemporaryDirectory()stringByAppendingString:@"TmpFile"]];
//设置后台播放
AVAudioSession *session = [AVAudioSessionsharedInstance];
NSError *sessionError;
[sessionsetCategory:AVAudioSessionCategoryPlayAndRecorderror:&sessionError];
//判断后台有没有播放
if (session == nil) {
NSLog(@"Error creating sessing:%@", [sessionError description]);
} else {
[session setActive:YES error:nil];
}
}
//录音按钮方法的实现
- (IBAction)startStopRecord:(id)sender {
//判断当录音状态为不录音的时候
if (!self.isRecoding) {
//将录音状态变为录音
self.isRecoding = YES;
//将录音按钮变为停止
[self.recordButton setTitle:@"停止"forState:UIControlStateNormal];
//播放按钮不能被点击
[self.playButton setEnabled:NO];
self.playButton.titleLabel.alpha = 0.5;
//开始录音,将所获取到得录音存到文件里
self.recorder = [[AVAudioRecorder alloc]initWithURL:_tmpFile settings:nil error:nil];
//准备记录录音
[_recorder prepareToRecord];
//启动或者恢复记录的录音文件
[_recorder record];
_player = nil;
} else {
//录音状态 点击录音按钮 停止录音
self.isRecoding = NO;
[self.recordButton setTitle:@"录音"forState:UIControlStateNormal];
//录音停止的时候,播放按钮可以点击
[self.playButton setEnabled:YES];
[self.playButton.titleLabel setAlpha:1];
//停止录音
[_recorder stop];
_recorder = nil;
&nnbsp;
NSError *playError;
self.player = [[AVAudioPlayer alloc]initWithContentsOfURL:_tmpFile error:&playError];
//当播放录音为空, 打印错误信息
if (self.player == nil) {
NSLog(@"Error crenting player: %@", [playError description]);
}
self.player.delegate = self;
}
}
//播放按钮方法的实现
- (IBAction)playPause:(id)sender {
//判断是否正在播放,如果正在播放
if ([self.player isPlaying]) {
//暂停播放
[_player pause];
//按钮显示为播放
[self.playButton setTitle:@"播放"forState:UIControlStateNormal];
} else {
//开始播放
[_player play];
//
[self.playButton setTitle:@"暂停"forState:UIControlStateNormal];
}
}
//当播放结束后调用这个方法
- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer*)player successfully:(BOOL)flag
{
//按钮标题变为播放
[self.playButton setTitle:@"播放"forState:UIControlStateNormal];
}
李洪强iOS开发之录音和播放实现的更多相关文章
- 李洪强iOS开发之-环信05_EaseUI 使用指南
李洪强iOS开发之-环信05_EaseUI 使用指南 EaseUI 使用指南 简介 EaseUI 封装了 IM 功能常用的控件(如聊天会话.会话列表.联系人列表).旨在帮助开发者快速集成环信 SDK. ...
- 李洪强iOS开发之添加手势
李洪强iOS开发之添加手势 02 - 添加手势
- 李洪强iOS开发之- 实现简单的弹窗
李洪强iOS开发之- 实现简单的弹窗 实现的效果: 112222222222223333333333333333
- 李洪强iOS开发之后使用XIB实现横向滚动的UIScrollView
李洪强iOS开发之后使用XIB实现横向滚动的UIScrollView 11111222
- 李洪强iOS开发之苹果使用预览截图
李洪强iOS开发之苹果使用预览截图 01 在预览的图片中选中你要截得区域 02 - command + C 03 - Command + N 04 - Command + S (保存)
- 李洪强iOS开发之通知的使用
李洪强iOS开发之通知的使用 01 - 在A中发送通知 02 - 在B中监听通知 03 - 在B中通知出发的方法 04 - 在B控制器viewDidLoad调用通知
- 李洪强iOS开发之后使用纯代码实现横向滚动的UIScrollView
李洪强iOS开发之后使用纯代码实现横向滚动的UIScrollView (VTmagic是一个实现左右滚动的控制器的框架,也可以实现此功能) 实现的效果: 01 - 创建四个控制器 02 - 定义需要 ...
- 李洪强iOS开发之 - 实现九宫格并使用SDWebImage下载图片
李洪强iOS开发之 - 实现九宫格并使用SDWebImage下载图片 源码: // // ViewController.m // 08-九宫格扩展 // // Created by 李洪强 ...
- 李洪强iOS开发之 - WebViewJavascriptBridge
李洪强iOS开发之 - WebViewJavascriptBridge 01 - JS端: 02 - iOS端 01 遵守代理协议 02 申明属性 03 开启日志 04 给哪个webview建立J ...
随机推荐
- luogu P1821 Silver Cow Party
题目描述 One cow from each of N farms (1 ≤ N ≤ 1000) conveniently numbered 1..N is going to attend the b ...
- Docker安装Oracle12C,导入dmp文件出现ORA-12170错误
oracle版本为 sath89/oracle-12c oracle基本信息 hostname: localhost port: 1521 sid: xe username: system passw ...
- Luogu-P1020(导弹拦截)(DP,LIS ,二分优化)
Luogu-P1020(导弹拦截)(DP) 题意: 给n(n<=100000) 个数字,求最长不上升子序列的长度和最少的不上升子序列的个数. 分析: 第一问: 求最长不上升子序列有 O(n^2) ...
- vs编译应用程序不依赖运行vs环境
控制台应用程序不依赖VS运行环境就可以运行的设置: 1,使用release模式编译 2,项目属性中,“C/C++”,“代码生成”中的运行库改为“多线程(/MT)” 3,项目属性中,“链接器”,“系统” ...
- BERT模型介绍
前不久,谷歌AI团队新发布的BERT模型,在NLP业内引起巨大反响,认为是NLP领域里程碑式的进步.BERT模型在机器阅读理解顶级水平测试SQuAD1.1中表现出惊人的成绩:全部两个衡量指标上全面超越 ...
- 五分钟掌握 for...in 和 for...of 区别
GitHub 地址,欢迎star,查看更多整理的前端知识 for...in for...in 语句以任意顺序遍历一个对象的可枚举属性. for...in 遍历对象本身的所有可枚举属性,以及对象从其构造 ...
- 条款14:在资源管理类中心copying行为(Think carefully about copying behavior in resource-manage classes)
NOTE: 1.复制RAII 对象必须一并赋值它所管理的资源,所以资源的copying行为决定RAII对象的copying行为. 2.普遍而常见的RAII class copying 行为是: 抑制c ...
- K8S部署
k8S部署 柯穴上网 安装openvpn来获取docker镜像(不是本文重点不做详述) 软件包安装 1 关闭iptables,禁用firewalld,关闭selinux 2 配置yum仓库(使用阿里云 ...
- 【C#】【数据结构】001-线性表:顺序表
C#数据结构:顺序表结构 1.自定义顺序表结构 using System.Collections; using System.Collections.Generic; /// <summary& ...
- 【Codeforces 827B】High Load
[链接] 我是链接,点我呀:) [题意] 题意 [题解] 树的最长链是一定会经过两个叶子节点的. 我们可以构造一棵树,让最后的最长链一定是由经过根节点的两条链组成. 然后让这两条链的长度尽可能短就好. ...