#pragma mark -  设置录制的音频文件的位置
- (NSString *)audioRecordingPath{
NSString *str_date=[TimeTransform DateToStringWithFormat:[NSDate date] withFormatString:@"yyyyMMDDHHmmss"];
AvdioName=str_date;
NSString *result = nil;
NSArray *folders = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsFolde = [folders objectAtIndex:0];
result = [documentsFolde stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.aac",str_date]];
return (result);
} #pragma mark -根据文件名获取文件路径
-(NSString *)getRecordingPathWithName:(NSString *)name{
NSArray *folders = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsFolde = [folders objectAtIndex:0];
NSString *result = nil;
result = [documentsFolde stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.aac",name]];
return result;
} #pragma mark -录音按钮
-(void)SoundAction:(UILongPressGestureRecognizer *)gestureRecognizer{ if (gestureRecognizer.state==UIGestureRecognizerStateBegan) {
NSLog(@"UIGestureRecognizerStateBegan"); //按下录音
if ([self canRecord]) { NSError *error = nil;
//必须真机上测试,模拟器上可能会崩溃
recorder = [[AVAudioRecorder alloc] initWithURL:[NSURL URLWithString:[self audioRecordingPath]] settings:recorderSettingsDict error:&error]; if (recorder) {
recorder.meteringEnabled = YES;
[recorder prepareToRecord];
[recorder record]; //启动定时器
timer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(levelTimer:) userInfo:nil repeats:YES];
NSLog(@"录制声音开始!"); [self performSelector:@selector(stopRecordingOnAudioRecorder:)
withObject:recorder
afterDelay:10.0f];
[view_black_bg setHidden:false];
} else
{
int errorCode = CFSwapInt32HostToBig ([error code]);
NSLog(@"Error: %@ [%4.4s])" , [error localizedDescription], (char*)&errorCode); }
} }else if (gestureRecognizer.state==UIGestureRecognizerStateEnded){
NSLog(@"UIGestureRecognizerStateEnded");
[lb_audio_title setText:AvdioName];
[self stopRecordingOnAudioRecorder:recorder];
[timer invalidate];
[view_black_bg setHidden:YES];
}
} -(void)levelTimer:(NSTimer*)timer_
{
//call to refresh meter values刷新平均和峰值功率,此计数是以对数刻度计量的,-160表示完全安静,0表示最大输入值
[recorder updateMeters];
const double ALPHAa = 0.05;
double peakPowerForChannel = pow(10, (0.05 * [recorder peakPowerForChannel:0]));
lowPassResults = ALPHAa * peakPowerForChannel + (1.0 - ALPHAa) * lowPassResults; NSLog(@"Average input: %f Peak input: %f Low pass results: %f", [recorder averagePowerForChannel:0], [recorder peakPowerForChannel:0], lowPassResults); // if (lowPassResults>=0.8) {
// soundLodingImageView.image = [UIImage imageNamed:[volumImages objectAtIndex:7]];
// }else if(lowPassResults>=0.7){
// soundLodingImageView.image = [UIImage imageNamed:[volumImages objectAtIndex:6]];
// }else if(lowPassResults>=0.6){
// soundLodingImageView.image = [UIImage imageNamed:[volumImages objectAtIndex:5]];
// }else if(lowPassResults>=0.5){
// soundLodingImageView.image = [UIImage imageNamed:[volumImages objectAtIndex:4]];
// }else if(lowPassResults>=0.4){
// soundLodingImageView.image = [UIImage imageNamed:[volumImages objectAtIndex:3]];
// }else if(lowPassResults>=0.3){
// soundLodingImageView.image = [UIImage imageNamed:[volumImages objectAtIndex:2]];
// }else if(lowPassResults>=0.2){
// soundLodingImageView.image = [UIImage imageNamed:[volumImages objectAtIndex:1]];
// }else if(lowPassResults>=0.1){
// soundLodingImageView.image = [UIImage imageNamed:[volumImages objectAtIndex:0]];
// }else{
// soundLodingImageView.image = [UIImage imageNamed:[volumImages objectAtIndex:0]];
// } } //判断是否允许使用麦克风7.0新增的方法requestRecordPermission
-(BOOL)canRecord
{
__block BOOL bCanRecord = YES;
if ([[[UIDevice currentDevice] systemVersion] compare:@"7.0"] != NSOrderedAscending)
{
AVAudioSession *audioSession = [AVAudioSession sharedInstance];
if ([audioSession respondsToSelector:@selector(requestRecordPermission:)]) {
[audioSession performSelector:@selector(requestRecordPermission:) withObject:^(BOOL granted) {
if (granted) {
bCanRecord = YES;
}
else {
bCanRecord = NO;
dispatch_async(dispatch_get_main_queue(), ^{
[[[UIAlertView alloc] initWithTitle:nil
message:@"app需要访问您的麦克风。\n请启用麦克风-设置/隐私/麦克风"
delegate:nil
cancelButtonTitle:@"关闭"
otherButtonTitles:nil] show];
});
}
}];
}
} return bCanRecord;
} #pragma mark -停止音频的录制
- (void)stopRecordingOnAudioRecorder:(AVAudioRecorder *)record{ [recorder stop];
recorder=nil; //结束定时器
[timer invalidate];
timer = nil;
}
/**
* 录音完成,录音完成后播放录音
*
* @param recorder 录音机对象
* @param flag 是否成功
*/
-(void)audioRecorderDidFinishRecording:(AVAudioRecorder *)recorder successfully:(BOOL)flag{ }

AVAudioRecorder、AVAudioPlayer录音及播放的更多相关文章

  1. Domain=NSOSStatusErrorDomain Code=1937337955 关于iOS录音AVAudioRecorder与音频播放AVAudioPlayer真机调试录音不能播放的问题

    error:Domain=NSOSStatusErrorDomain Code=1937337955 ,这个错误很常见, 原因是因为我们需要调用另外一个AVAudioPlayer 的初始化方法,来确定 ...

  2. IOS关于录音,播放实现总结

    //音频录制(标准过程5,9更新) 准备:导入AVFoundation框架及头文件 1 设置会话类型,允许播放及录音AVAudioSession *audioSession = [AVAudioSes ...

  3. AVFoundation之录音及播放

    录音 在开始录音前,要把会话方式设置成AVAudioSessionCategoryPlayAndRecord //设置为播放和录音状态,以便可以在录制完之后播放录音 AVAudioSession *s ...

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

    李洪强iOS开发之录音和播放实现 //首先导入框架后,导入头文件.以下内容为托控件,在storyboard中拖出两个按钮为录音和播放按钮 //创建一个UIViewController在.h文件中写 # ...

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

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

  6. Android开发教程 录音和播放

    首先要了解andriod开发中andriod多媒体框架包含了什么,它包含了获取和编码多种音频格式的支持,因此你几耍轻松把音频合并到你的应用中,若设备支持,使用MediaRecorder APIs便可以 ...

  7. Android平台下实现录音及播放录音功能的简介

    录音及播放的方法如下: package com.example.audiorecord; import java.io.File; import java.io.IOException; import ...

  8. windows phone 7 通过麦克风录音,并且播放

    原文:windows phone 7 通过麦克风录音,并且播放 //模拟XNA的框架(凡是在wp7中应用xna的都必须先模拟此类) public class XNAAsyncDispatcher : ...

  9. iOS 实时录音和播放

    需求:最近公司需要做一个楼宇对讲的功能:门口机(连接WIFI)拨号对室内机(对应的WIFI)的设备进行呼叫,室内机收到呼叫之后将对收到的数据进行UDP广播的转发,手机(连接对应的WIFI)收到视频流之 ...

随机推荐

  1. 使用SAE部署Flask,使用非SAE flask版本和第三方依赖包的方法

    目前SAE的Flask的版本为0.7,但是我从学习开始的flask版本就已经是0.10了,而且一些扩展都是使用的0.10以后的from flask.ext.特性进行引入的.所以需要修改SAE的环境. ...

  2. java中synchronized的用法详解

    记下来,很重要. Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码. 一.当两个并发线程访问同一个对象object中的这个synchron ...

  3. volicety常用方法

    1.volicety得到某个元素的个数 $extendsInfos.size() 2.volicety 布尔值判断: 如果a为null,#if($a) ,产生的判断值是false  等同于#if(fa ...

  4. Innodb物理存储结构系列1

    本篇先介绍 下Innodb表空间,文件相关的内存数据结构. 1. 数据结构 Innodb的tablespace和文件的关系,是一对多的关系,先来看三个结构体 1. fil_system_struct: ...

  5. 生产环境上shell的解读

    一直以来对shell都不是很熟悉,只停留在基本的linux上操作上,这周因为定位问题接触到了生产环境上的脚本,因此作为引子学习一下.很多命令只是点到,等真正需要独立完成的时候再去学习. #!/bin/ ...

  6. Android Fragment学习(一)

    说明 Fragment是在Android3.0(即API 11)才出现的,如果在之前的版本要使用,需要添加support库. Fragment可以认为是Actvity模块化的组件,可以很方便地被添加, ...

  7. 11、四大组件之二-Service高级(二)Native Service

    一.Service的分类 1.1>Android Service 使用Java编写在JVM中运行的服务 1.2>Native Service 使用C/C++完成的服务,一般在系统开始时完成 ...

  8. 类内const static(static const)成员变量初始化问题

    在查找const相关资料的过程中,又遇到了另外一个问题,就是C++类中const static(或者static const)成员变量应当如何初始化的问题. 查阅了许多资料,发现VC环境下,只允许co ...

  9. eventlet的学习

    转自:http://bingotree.cn/?p=281 官方网站:http://eventlet.net/ 之前小秦我写了篇python中协程和yield的文章,这里小秦我再总结一下eventle ...

  10. 《GettingThingsDone》--GTD学习笔记(三)-GTD的三个关键原则

    原则一:养成收集的习惯 1.收集习惯给个人带来的好处     在收集过程中你会出现焦虑和解脱,难以招架和控制良好的情绪. (1)消极情绪的来源     要做的事情总比你能做的事情多,要做的事情太多并不 ...