前言:闲来无事帮别人写的,利用麦克风声音来实现吹裙子的动画效果,因为录下来的东西不需要播放,所以在停止录音的同时删除文件。

大致步骤:

1、首先需要在plist文件中添加Privacy - Microphone Usage Description这个key值;

2、导入AVFoundation框架;

3、初始化录音实例:

3.1、设置录音文件存放路径;

3.2、录音配置;

3.3、开启监控声波设置;

4、开始录音;

5、添加计时器;

6、停止录音;

7、销毁计时器;

8、删除文件;

demo实现代码:

#import "BlowSkirtVC.h"
#import <AVFoundation/AVFoundation.h>//图片个数
static const NSInteger KImageCount = 20;
static const CGFloat KDurationLevel = 0.05;
//录音文件存放路径
#define KRecorderFilePath [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0] stringByAppendingPathComponent:@"play.aac"]@interface BlowSkirtVC ()//录音实例
@property (nonatomic,strong) AVAudioRecorder *recorder;
//定时器
@property (nonatomic,strong) NSTimer *levelTimer;
//图片实例
@property (nonatomic,strong) UIImageView *imageV;
//图片数组
@property (nonatomic,strong) NSMutableArray *imageArray;@property (nonatomic,assign)  double lowPassResults;@end@implementation BlowSkirtVC- (void)viewDidLoad {[super viewDidLoad];//1.添加图片[self addImageView];//2.添加按钮[self addRecorderBtn];
}#pragma mark 添加图片视图
- (void)addImageView
{[self.view addSubview:self.imageV];
}#pragma mark 添加按钮
- (void)addRecorderBtn
{CGFloat recorderBtnX = CGRectGetMinX(self.imageV.frame);CGFloat recorderBtnY = CGRectGetMaxY(self.imageV.frame) + 20;CGFloat recorderBtnW = self.imageV.frame.size.width;CGFloat recorderBtnH = 44;UIButton *recorderBtn = [UIButton buttonWithType:UIButtonTypeCustom];recorderBtn.backgroundColor = [UIColor redColor];recorderBtn.frame = CGRectMake(recorderBtnX, recorderBtnY, recorderBtnW, recorderBtnH);[recorderBtn setTitle:@"按住 说话" forState:UIControlStateNormal];[recorderBtn setTitle:@"松开 结束" forState:UIControlStateHighlighted];[recorderBtn addTarget:self action:@selector(startRecord) forControlEvents:UIControlEventTouchDown];[recorderBtn addTarget:self action:@selector(stopRecord) forControlEvents:UIControlEventTouchUpInside];[self.view addSubview:recorderBtn];
}#pragma mark 开启录音
- (void)startRecord
{//0.判断是否正在录音,如果有则停止if ([self.recorder isRecording]) {[self.recorder stop];}//1.设置AVAudioSession分类AVAudioSession *audioSession=[AVAudioSession sharedInstance];[audioSession setCategory:AVAudioSessionCategoryRecord error:nil];//2.准备录音[self.recorder prepareToRecord];//3.开始录音[self.recorder record];//4.添加计时器[self.levelTimer fire];
}#pragma mark 结束录音
- (void)stopRecord
{//1.停止录音,并设为nil[_recorder stop];_recorder = nil;//2.停止计时器,并设为nil[_levelTimer invalidate];_levelTimer = nil;//3.恢复图片最初状态NSInteger currentLevel = _lowPassResults/KDurationLevel;if (currentLevel > 0) {//3.1添加数据源NSMutableArray *animationArray = [NSMutableArray array];for (int i = 0; i < currentLevel; i ++) {UIImage *image = _imageArray[currentLevel - i];[animationArray addObject:image];}//3.2设置动画执行后需要现实的图片_imageV.image = _imageArray.firstObject;_imageV.animationImages = animationArray;//3.3重复次数_imageV.animationRepeatCount = 1;//3.4执行一次需要的时间_imageV.animationDuration = 2;//3.5开始动画[_imageV startAnimating];}//4.删除录音文件,以免数据量太大[self deleteOldRecordFile];//5.设置lowPassResults为0_lowPassResults = 0;
}- (UIImageView *)imageV
{if (!_imageV) {CGFloat imageVW = 200;CGFloat imageVH = imageVW;_imageV = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, imageVW, imageVH)];_imageV.center = self.view.center;_imageV.image = self.imageArray.firstObject;}return _imageV;
}- (NSMutableArray *)imageArray
{if (!_imageArray) {_imageArray = [NSMutableArray array];for (int i = 0; i < KImageCount; i ++) {NSString *imageName = [NSString stringWithFormat:@"Blowskirt%d_@2x.jpg",i + 1];UIImage *image = [UIImage imageNamed:imageName];[_imageArray addObject:image];}}return _imageArray;
}- (AVAudioRecorder *)recorder
{if (!_recorder) {//1.录音文件存储路径NSURL *url = [NSURL URLWithString:KRecorderFilePath];//2.录音设置NSDictionary *setting = [self getAudioSetting];//3.实例化对象NSError *error = nil;_recorder = [[AVAudioRecorder alloc] initWithURL:url settings:setting error:&error];//3.1如果要监控声波则必须设置为YES_recorder.meteringEnabled = YES;if (error) {NSLog(@"创建录音机对象时发生错误,错误信息:%@",error.localizedDescription);return nil;}}return _recorder;
}#pragma mark 录音配置
-(NSDictionary *)getAudioSetting
{//录音设置NSMutableDictionary *recordSettings = [NSMutableDictionary dictionary];//录音格式[recordSettings setValue:[NSNumber numberWithInt:kAudioFormatMPEG4AAC] 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;
}- (NSTimer *)levelTimer
{if (!_levelTimer) {_levelTimer = [NSTimer scheduledTimerWithTimeInterval:0.03 target:self selector:@selector(levelTimerCallback:) userInfo:nil repeats:YES];}return _levelTimer;
}#pragma mark 计时器执行的方法
- (void)levelTimerCallback:(NSTimer *)timer
{//1.刷新电平值,-120表示完全安静,0表示最大输入值[_recorder updateMeters];//2.获取峰值电平并转化为0-1const double ALPHA = 0.05;double peakPowerForChannel = pow(10, (0.05 * [self.recorder peakPowerForChannel:0]));_lowPassResults = ALPHA * peakPowerForChannel + (1.0 - ALPHA) * _lowPassResults;NSLog(@"Average input: %f Peak input: %f Low pass results: %f", [self.recorder averagePowerForChannel:0], [self.recorder peakPowerForChannel:0], _lowPassResults);//3.根据值转换为对应的等级的图片,此处以0.05为划分NSInteger currentLevel = _lowPassResults/KDurationLevel;//3.1防止数组越界if (currentLevel >= KImageCount - 1) {currentLevel = KImageCount - 1;}_imageV.image = _imageArray[currentLevel];}#pragma mark 删除录音文件
- (void)deleteOldRecordFile
{[self deleteOldRecordFileAtPath:KRecorderFilePath];
}#pragma mark 删除录音文件(根据相应的路径)
- (void)deleteOldRecordFileAtPath:(NSString *)pathStr
{NSFileManager* fileManager=[NSFileManager defaultManager];BOOL blHave=[[NSFileManager defaultManager] fileExistsAtPath:pathStr];if (!blHave) {NSLog(@"不存在");return ;}else {NSLog(@"存在");BOOL blDele= [fileManager removeItemAtPath:pathStr error:nil];if (blDele) {NSLog(@"删除成功");}else {NSLog(@"删除失败");}}
}@end

demo下载链接: http://download.csdn.net/detail/u011154007/9674248

IOS 利用麦克风声音来实现吹裙子的动画效果相关推荐

  1. html仿微信拆红包效果旋转,利用React加CSS3实现微信拆红包动画效果实例(代码)...

    本篇文章主要介绍了利用React加CSS3实现微信拆红包动画效果实例(代码),具有一定的参考价值,感兴趣的小伙伴们可以参考一下. 微信红包曾经引爆过一系列的营销热潮,相信大家对于这种红包形式并不陌生, ...

  2. 利用CSS中的transform、transition等动画效果制作拍立得卡片效果

    首先我们要知道拍立得的版型样式 即图片+留白 先点击右侧  演示网页  演示效果 版型样式为一个大盒子装一个小盒子图片和文字.CSS里面要记得图片和文字分别水平居中,用text-align,还有hov ...

  3. 利用AnimationController实现雨滴落下的flutter动画效果。

    GitHub - guipie/flutter_demo: flutter 动画效果的一些demo示例. 首先声明一个雨滴对象: class Particle {double x;double y;d ...

  4. android 吹裙子,Android吹裙子的实现代码

    Android吹裙子的实现代码方法,今天给大家带来安卓中的游戏,吹裙子的核心实现代码,如下: package com.xxiyy.spl; import android.media.AudioForm ...

  5. android吹裙子的实现代码

    今天给大家带来安卓中的游戏,吹裙子的核心实现代码,如下: package com.xxiyy.spl;import android.media.AudioFormat; import android. ...

  6. 麦克风声源定位原理_一种利用麦克风阵列进行声源定位的方法与流程

    本发明涉及计算机信号处理领域,具体涉及一种用麦克风阵列时延估计定位声源的方法. 背景技术: 20世纪80年代以来,麦克风阵列信号处理技术得到迅猛的发展,并在雷达.声纳及通信中得到广泛的应用.这种阵列信 ...

  7. 阵列麦克风声音定位-代码python实现-二维与三维声音定位

    0 声音处理基础专业名词 FT - 傅立叶变换FT(Fourier Transform) 时域频域转换,此链接讲的很清晰. FFT - 快速傅里叶变换 (fast Fourier transform) ...

  8. Tiva单片机——麦克风声音数据的储存/回放(Flash读/写)

    Tiva单片机--麦克风声音数据的储存/回放(Flash读/写) 一.整体介绍 1. 第一次设计 2. 第二次设计 3. 最终实现情况 二.代码的分段解读 1. 头函数 2. 宏定义 3. Flash ...

  9. UIView封装动画--iOS利用系统提供方法来做关键帧动画

    iOS利用系统提供方法来做关键帧动画 ios7以后才有用. /*关键帧动画options:UIViewKeyframeAnimationOptions类型*/[UIView animateKeyfra ...

最新文章

  1. 群晖 emby_NAS上安装emby,打造家庭媒体中心
  2. 居然有老板禁止员工热饭:要么吃冷的,要么找人送...
  3. 高动态范围(HDR)
  4. python抓取网页信息_python抓取网页中的动态数据
  5. 牛津英语3a_空中课堂 | 牛津英语学霸笔记3A M3U2
  6. 洛谷P4219 大融合(LCT、虚子树)
  7. 淘宝内核月报 2017
  8. 模型预测控制的缺点_【电子技术】【2018.01】模型预测控制FPGA实现的协同设计...
  9. PHP的php://input和$HTTP_RAW_POST_DATA 和$_POST的关系
  10. mysql服务端获取数据乱码_mysql客户端数据乱码问题
  11. netty源码解读六(内存池相关)
  12. java登陆密码加密怎么做,Java如何实现密码加密
  13. 决手动打开凭据管理器报0x80070005错误的问题-CMD方式
  14. GNU C++ 智能指针6-- 解析_Sp_counted_inplace类
  15. 用js将HTML文本导出生成word文档
  16. html设置背景图片覆盖不重复
  17. 微信小程序主体如何变更?小程序迁移流程详解
  18. python中的科学计数法表示
  19. 20,sql 测试 : 1.4g 文件的 sql 运行测试,表关联,日期转换,字符编码,乱码解决,程序的 shell 执行,字符串转数字,三个隐式转换,用列分区,输出,sum over
  20. 活动库存限制是“递增”还是“递减”、你认为哪种方式更好些???

热门文章

  1. 使用socket 情况下的windows系统与ubuntu16.04系统通信
  2. 个人课程总结——软件工程结课
  3. kaldi中的chain model(LFMMI)详解
  4. RCU机制 - ARM汇编同步机制实例(七)
  5. 互联网:常见术语定义,B2B、B2C、SaaS、O2O、ERP、SPU、SKU、批次号等
  6. 关于流的关闭方式自动方式写法
  7. 结合百度云平台和微信公众平台开发(二)
  8. 解决低版本Xcode不支持高版本iOS真机调试的问题
  9. 记一次ssh免密登录失败的debug经历
  10. Centos 8使用yum或者dnf安装时报错解决