<AudioToolbox/AudioToolbox.h> :这个库是C的接口,偏向于底层,主要用于在线流媒体的播放
<AVFoundation/AVFoundation.h> :提供了音频和回放的底层API,同时也负责管理音频的硬件
//需要遵循一个代理协议<AVAudioRecorderDelegate>
 
 
 
 
 
//
//  ViewController.m
//  录音录频
//

#import "ViewController.h"
//提供了音频和回放的底层API,同时也负责管理音频硬件
#import <AVFoundation/AVFoundation.h>

//这个库是C的接口,偏向于底层,主要用于在线流媒体的播放
#import <AudioToolbox/AudioToolbox.h>

@interface ViewController () <AVAudioRecorderDelegate>

{
    //用来录音
    AVAudioRecorder *recorder;

//设置定时检测,用来监听当前音量大小,控制话筒图片
    NSTimer *timer;
   
    //设置一个路径,用来保存本地录音的路径
    NSURL *urlPlay;
   
   
   
}

//用来控制录音功能
@property (nonatomic, strong) UIButton *btn;

//用来播放已经录好的音频文件
@property (nonatomic, strong) UIButton *playBtn;

//控制音量的图片
@property (nonatomic, strong) UIImageView *imageView;

//音频播放器
@property (nonatomic, strong) AVAudioPlayer *paly;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
   
    //基本步骤:1.进行录音设置(先配置录音机(是一个字典),设置录音的格式,录音的采样率,录音的先行采样位数,录音的通道数,录音质量,录音路径,初始化录音对象,开启音量检测);2.设置录音按钮的功能(UI设置)3.设置播放按钮并实现播放功能
    //1.进行录音设置
    [self audio];
   
    //实现录音按钮的功能(UI设置)
    //2.加图片
    self.imageView = [[UIImageView alloc] initWithFrame:CGRectMake((self.view.frame.size.width - 100)/2, 100, 100, 100)];
    self.imageView.backgroundColor = [UIColor redColor];
   
    self.btn = [UIButton buttonWithType:UIButtonTypeCustom];
   
    self.btn.frame = CGRectMake(self.imageView.frame.origin.x, 250, 50, 40);    [self.btn setTitle:@"开始" forState:UIControlStateNormal];    [self.btn setBackgroundColor:[UIColor greenColor]];    self.playBtn = [UIButton buttonWithType:UIButtonTypeCustom];    self.playBtn.frame = CGRectMake(self.imageView.frame.origin.x + 50, 250, 50, 40);    [self.playBtn setTitle:@"播放" forState:UIControlStateNormal];    [self.playBtn setBackgroundColor:[UIColor cyanColor]];    [self.playBtn addTarget:self action:@selector(paly:) forControlEvents:UIControlEventTouchUpInside];       //设置按钮的事件,当按钮被按下时    [self.btn addTarget:self action:@selector(btnDown:) forControlEvents:UIControlEventTouchDown];    //当手指抬起时     [self.btn addTarget:self action:@selector(btnUp:) forControlEvents:UIControlEventTouchUpInside];       //当触摸拖动离开控制范围时     [self.btn addTarget:self action:@selector(btnDragUp:) forControlEvents:UIControlEventTouchDragExit];       [self.view addSubview:self.playBtn];    [self.view addSubview:self.btn];    [self.view addSubview:self.imageView];         }//点击播放按钮的实现播放- (void)paly:(UIButton *)sender{    //加载本地录音文件    self.paly = [[AVAudioPlayer alloc] initWithContentsOfURL:urlPlay error:nil];    //准备播放    [self.paly prepareToPlay];    //播放    [self.paly play];   }//录音设置的方法- (void)audio{    //1.先配置Recorder(录音机)    NSMutableDictionary *recorderSetting = [NSMutableDictionary dictionary];

   
    //2.设置录音的格式 / *在2000年被用在MPEG-4中(ISO 14496-3 Audio),所以现在变更为MPEG-4 AAC标准,也就是说,AAC已经成为MPEG4家族的主要成员之一,它是MPEG4第三部分中的音频编码系统。AAC可提供最多48个全音域音频通道。*/
    [recorderSetting setValue:[NSNumber numberWithInt:kAudioFormatMPEG4AAC] forKey:AVFormatIDKey];
   
    //3.设置录音采样率 --采样频率是指录音设备在一秒钟内对声音信号的采样次数,采样频率越高声音的还原就越真实越自然。在当今的主流声卡上,采样频率一般共分为22.05KHz、44.1KHz、48KHz三个等级,22.05只能达到FM广播的声音品质,44.1KHz则是理论上的CD音质界限,48KHz则更加精确一些
    [recorderSetting setValue:[NSNumber numberWithFloat:44100] forKey:AVSampleRateKey];

//4.设置录音的通道数
    [recorderSetting setValue:[NSNumber numberWithInt:1] forKey:AVNumberOfChannelsKey];
   

    //5.线性采样位数 8 ,16 ,24 ,32、采样位数可以理解为声卡处理声音的解析度。这个数值越大,解析度就越高,录制和回放的声音就越真实 --一般都是16位的(2的16次方)/*

PCM的基本参数是采样频率和采样位深,采样频率就是每秒采样多少次,位深就是声音通过拾音器转成的电平信号被量化的精细度,同时也代表一次采样会用多少位保存
*/
    [recorderSetting setValue:[NSNumber numberWithInt:16] forKey:AVLinearPCMBitDepthKey];
   
    //6,录音质量
    [recorderSetting setValue:[NSNumber numberWithInt:AVAudioQualityHigh] forKey:AVEncoderAudioQualityKey];
   
    //设置录音路径
    NSString *strUrl = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
   
    NSURL *url = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/record.aac",strUrl]];
   
    //记录当前路径
    urlPlay = url;
   
    //初始化录音对象
    NSError *error;
    recorder = [[AVAudioRecorder alloc] initWithURL:url settings:recorderSetting error:&error];
   
    //开启音量检测
    recorder.meteringEnabled = YES;
    recorder.delegate = self;

}

- (void)btnDown:(UIButton *)sender
{
   
    [sender setTitle:@"停止" forState:UIControlStateNormal];
    //创建录音文件,准备录音
    if([recorder prepareToRecord]){
   
        //开始
        [recorder record];
       
    }
   
    //设置定时检测,检测我们的图片
    timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(detectionVioce) userInfo:nil repeats:YES];

}
- (void)btnUp:(UIButton *)sender{

//UI状态
    [sender setTitle:@"开始" forState:UIControlStateNormal];
   
    //记录当前时间
    double cTime = recorder.currentTime;
   
    if (cTime > 2) {
       
        NSLog(@"放出去");
    }else{
        //删除我们的记录文件
        [recorder deleteRecording];
   
    }
   
    //停止录音
    [recorder stop];
    //停止计时器
    [timer invalidate];
}

- (void)btnDragUp:(UIButton *)sender{

[sender setTitle:@"开始" forState:UIControlStateNormal];
   
    //删除录制文件
    [recorder deleteRecording];
    //停止录音
    [recorder stop];
    //停止计时器
    [timer invalidate];
   
    NSLog(@"取消发送");
   
   
}

//检测当前声音
- (void)detectionVioce
{
   
    //刷新当前音量数据
    [recorder updateMeters];
    //获取音量的平均值
    double lowPassResults = pow(10, (0.05 * [recorder peakPowerForChannel:0]));//×于当前音量
     //现在取值范围在0~1   (每隔0.7)
    if(0 < lowPassResults < 0.06){
   
   
        [self.imageView setImage:[UIImage imageNamed:@"iconfont-huatong(1)"]];
    }else if( 0.06< lowPassResults <= 0.13){
   
      [self.imageView setImage:[UIImage imageNamed:@"iconfont-huatong(2)"]];
   
    }else if( 0.13<lowPassResults <= 0.20){
       
        [self.imageView setImage:[UIImage imageNamed:@"iconfont-huatong(3)"]];
       
    }else if( 0.20 <lowPassResults <= 0.27){
       
        [self.imageView setImage:[UIImage imageNamed:@"iconfont-huatong(4)"]];
       
    }else if( 0.27 <lowPassResults <= 0.34){
       
        [self.imageView setImage:[UIImage imageNamed:@"iconfont-huatong(5)"]];
       
    }else if( 0.34 <lowPassResults <= 0.41){
       
        [self.imageView setImage:[UIImage imageNamed:@"iconfont-huatong(6)"]];
       
    }else if( 0.41 <lowPassResults <= 0.48){
       
        [self.imageView setImage:[UIImage imageNamed:@"iconfont-huatong(7)"]];
       
    }。。。。。){               [self.imageView setImage:[UIImage imageNamed:@"iconfont-huatong(8)"]];           }else if( 0.55 <lowPassResults <= 0.62){               [self.imageView setImage:[UIImage imageNamed:@"iconfont-huatong(9)"]];           }else if( 0.62 <lowPassResults <= 0.69){               [self.imageView setImage:[UIImage imageNamed:@"iconfont-huatong(10)"]];           }){               [self.imageView setImage:[UIImage imageNamed:@"iconfont-huatong(8)"]];           }else if( 0.55 <lowPassResults <= 0.62){               [self.imageView setImage:[UIImage imageNamed:@"iconfont-huatong(9)"]];           }else if( 0.62 <lowPassResults <= 0.69){               [self.imageView setImage:[UIImage imageNamed:@"iconfont-huatong(10)"]];           }else if( 0.69 <lowPassResults <= 0.76){               [self.imageView setImage:[UIImage imageNamed:@"iconfont-huatong(11)"]];           }else if( 0.76 <lowPassResults <= 0.83){               [self.imageView setImage:[UIImage imageNamed:@"iconfont-huatong(12)"]];           }else if( 0.83 <lowPassResults <= 0.90){               [self.imageView setImage:[UIImage imageNamed:@"iconfont-huatong(13)"]];           }else{                      [self.imageView setImage:[UIImage imageNamed:@"iconfont-huatong(14)"]];           }else if( 0.48 <lowPassResults <= 0.55){               [self.imageView setImage:[UIImage imageNamed:@"iconfont-huatong(8)"]];           }else if( 0.55 <lowPassResults <= 0.62){               [self.imageView setImage:[UIImage imageNamed:@"iconfont-huatong(9)"]];           }else if( 0.62 <lowPassResults <= 0.69){               [self.imageView setImage:[UIImage imageNamed:@"iconfont-huatong(10)"]];           }else if( 0.69 <lowPassResults <= 0.76){               [self.imageView setImage:[UIImage imageNamed:@"iconfont-huatong(11)"]];           }else if( 0.76 <lowPassResults <= 0.83){               [self.imageView setImage:[UIImage imageNamed:@"iconfont-huatong(12)"]];           }else if( 0.83 <lowPassResults <= 0.90){               [self.imageView setImage:[UIImage imageNamed:@"iconfont-huatong(13)"]];           }else{                      [self.imageView setImage:[UIImage imageNamed:@"iconfont-huatong(14)"]];           }else if( 0.48 <lowPassResults <= 0.55){               [self.imageView setImage:[UIImage imageNamed:@"iconfont-huatong(8)"]];           }else if( 0.55 <lowPassResults <= 0.62){               [self.imageView setImage:[UIImage imageNamed:@"iconfont-huatong(9)"]];           }else if( 0.62 <lowPassResults <= 0.69){               [self.imageView setImage:[UIImage imageNamed:@"iconfont-huatong(10)"]];           }else if( 0.69 <lowPassResults <= 0.76){               [self.imageView setImage:[UIImage imageNamed:@"iconfont-huatong(11)"]];           }else if( 0.76 <lowPassResults <= 0.83){               [self.imageView setImage:[UIImage imageNamed:@"iconfont-huatong(12)"]];           }else if( 0.83 <lowPassResults <= 0.90){               [self.imageView setImage:[UIImage imageNamed:@"iconfont-huatong(13)"]];           }else{                      [self.imageView setImage:[UIImage imageNamed:@"iconfont-huatong(14)"]];           }else if( 0.48 <lowPassResults <= 0.55){               [self.imageView setImage:[UIImage imageNamed:@"iconfont-huatong(8)"]];           }else if( 0.55 <lowPassResults <= 0.62){               [self.imageView setImage:[UIImage imageNamed:@"iconfont-huatong(9)"]];           }else if( 0.62 <lowPassResults <= 0.69){               [self.imageView setImage:[UIImage imageNamed:@"iconfont-huatong(10)"]];           }else if( 0.69 <lowPassResults <= 0.76){               [self.imageView setImage:[UIImage imageNamed:@"iconfont-huatong(11)"]];           }else if( 0.76 <lowPassResults <= 0.83){               [self.imageView setImage:[UIImage imageNamed:@"iconfont-huatong(12)"]];           }else if( 0.83 <lowPassResults <= 0.90){               [self.imageView setImage:[UIImage imageNamed:@"iconfont-huatong(13)"]];           }else{                      [self.imageView setImage:[UIImage imageNamed:@"iconfont-huatong(14)"]];           }){               [self.imageView setImage:[UIImage imageNamed:@"iconfont-huatong(8)"]];           }else if( 0.55 <lowPassResults <= 0.62){               [self.imageView setImage:[UIImage imageNamed:@"iconfont-huatong(9)"]];           }else if( 0.62 <lowPassResults <= 0.69){               [self.imageView setImage:[UIImage imageNamed:@"iconfont-huatong(10)"]];           }else if( 0.69 <lowPassResults <= 0.76){               [self.imageView setImage:[UIImage imageNamed:@"iconfont-huatong(11)"]];           }else if( 0.76 <lowPassResults <= 0.83){               [self.imageView setImage:[UIImage imageNamed:@"iconfont-huatong(12)"]];           }else if( 0.83 <lowPassResults <= 0.90){               [self.imageView setImage:[UIImage imageNamed:@"iconfont-huatong(13)"]];           }else{                      [self.imageView setImage:[UIImage imageNamed:@"iconfont-huatong(14)"]];           }0.69){               [self.imageView setImage:[UIImage imageNamed:@"iconfont-huatong(10)"]];           }else if( 0.69 <lowPassResults <= 0.76){               [self.imageView setImage:[UIImage imageNamed:@"iconfont-huatong(11)"]];           }else if( 0.76 <lowPassResults <= 0.83){               [self.imageView setImage:[UIImage imageNamed:@"iconfont-huatong(12)"]];           }else if( 0.83 <lowPassResults <= 0.90){               [self.imageView setImage:[UIImage imageNamed:@"iconfont-huatong(13)"]];           }else{                      [self.imageView setImage:[UIImage imageNamed:@"iconfont-huatong(14)"]];          

ios录音Demo的更多相关文章

  1. 【iOS 录音转码MP3及转码BASE64上传】

    iOS 录音转码MP3及转码BASE64上传 一,开始录音 NSLog(@"开始录音"); [self startRecord]; - (void)startRecord { // ...

  2. 91平台iOS接入demo

    源码:http://pan.baidu.com/s/1DuBl6 今天整理硬盘,找到了一个有趣的demo.一年前,91助手游戏联运呈爆棚趋势,但是许多使用FlashAir开发的优秀的游戏和应用都卡在了 ...

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

    作用AVPLayer:可以用来播放在线及本地音视频AVAudioSession:音频会话,主要用来管理音频设置与硬件交互使用时需要导入 #import <AVFoundation/AVFound ...

  4. 【iOS录音与播放】实现利用音频队列,通过缓存进行对声音的采集与播放

    都说iOS最恶心的部分是流媒体,其中恶心的恶心之处更在即时语音. 所以我们先不谈即时语音,研究一下,iOS中声音采集与播放的实现. 要在iOS设备上实现录音和播放功能,苹果提供了简单的做法,那就是利用 ...

  5. lame,把ios录音转换为mp3格式

    在ios设备中进行录音,录音文件的格式为caf.但这种格式在很多设备中没法播放.为了适应终端的播放功能,特将caf转换为mp3格式文件来使用. 在录制caf文件时,需要使用双通道,否则在转换为MP3格 ...

  6. 03.WebView演练-iOS开发Demo(示例程序)源代码

    技术博客http://www.cnblogs.com/ChenYilong/   新浪微博http://weibo.com/luohanchenyilong   //转载请注明出处--本文永久链接:h ...

  7. XMPP协议实现即时通讯底层书写 (二)-- IOS XMPPFramework Demo+分析

    我希望,This is a new day! 在看代码之前,我认为你还是应该先整理一下心情,来听我说几句: 首先,我希望你是在早上边看这篇blog,然后一边開始动手操作,假设你仅仅是看blog而不去自 ...

  8. 适合新人学习的iOS官方Demo

    UICatalog.包括了绝大部分经常使用的UI,入门必备良药. 9  分段选择器 10滑动条 Slider 11stack view 12 分步条 13 开关 14 textfield 15text ...

  9. iOS商城demo、音乐播放器、视频通话、自定义搜索、转场动画等源码

    iOS精选源码 微信自定义搜索框实现 一个商城Demo,持续更新中 在Object-C中学习数据结构与算法之排序算法 iOS 音乐播放器之锁屏歌词+歌词解析+锁屏效果 XLsn0wPushTimePi ...

随机推荐

  1. Select与Epoll比较

    一.问题引出 联系区别 问题的引出,当需要读两个以上的I/O的时候,如果使用阻塞式的I/O,那么可能长时间的阻塞在一个描述符上面,另外的描述符虽然有数据但是不能读出来,这样实时性不能满足要求,大概的解 ...

  2. HDU2579

    Dating with girls(2) Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  3. Javascript/js的相等和不等运算符(= 、== 、===)

    "=="和"==="运算符用于比较两个值是否相等,当然它们对相等的定义不尽相同.两个运算符允许任意类型的操作数,如果操作数相等则返回tru,否则返回false. ...

  4. js_DOM操作

    嗯,大过年的上次更新应该还是在,大年30前一天,说好的一天更一篇,感觉食言了,虽然没有更,但是,每天还是坚持在学习的,所以今天的任务就是把这几天学的都发上来. 博客,我觉得不仅仅是交流知识的地方,我宁 ...

  5. HDU 1006 [Tick Tick]时钟问题

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1006 题目大意:钟表有时.分.秒3根指针.当任意两根指针间夹角大于等于n°时,就说他们是happy的, ...

  6. spring事件驱动模型--观察者模式在spring中的应用

    spring中的事件驱动模型也叫作发布订阅模式,是观察者模式的一个典型的应用,关于观察者模式在之前的博文中总结过,http://www.cnblogs.com/fingerboy/p/5468994. ...

  7. 怎样在chrome中内置扩展,以及一些简单的定制

    本文中chromium 版本为54 参考资料: chromium如何新增extension API以及添加内部扩展 http://slides.com/luyuan/grit#/ 一.嵌入扩展 1.  ...

  8. select中的文字垂直居中的问题

    select文字在默认和边框高度增加时 是默认居中的.你要是不想居中的话可以用padding值调整.但是右侧的三角不会改变. select在高度减小时.字体是不会垂直居中的.无论你用什么他都不会垂直居 ...

  9. OOP面向对象三大特点

    OOP面向对象三大特点 (一)封装:将现实中一个事物的属性和功能集中定义在一个对象中.(创建对象) 创建对象的3种方式: 1.直接量方式:(创建一个单独的对象) var obj={ 属性名:值,    ...

  10. [Hadoop] - TaskTracker源码分析

    在Hadoop1.x版本中,MapReduce采用master/salve架构,TaskTracker就是这个架构中的slave部分.TaskTracker以服务组件的形式存在,负责任务的执行和任务状 ...