AVAudioRecorder录音和AVAudioPlayer播放

来源:互联网 发布:c语言void什么意思 编辑:程序博客网 时间:2024/04/27 06:54
#import "RecorderViewController.h"
#import <AVFoundation/AVFoundation.h>

@interface RecorderViewController ()<AVAudioRecorderDelegate, AVAudioPlayerDelegate>

@property(nonatomic, retain) AVAudioRecorder *L_AVAudio;

@property(nonatomic, retain) AVAudioPlayer *player;

@property(nonatomic, retain) UIImageView *imageview;

@property(nonatomic, retain) UIView *voView;

@property(nonatomic, retain) UIView *backView;

@property(nonatomic, retain) NSTimer *timer;//录音声波监控(注意这里暂时不对播放进行监控)

@property(nonatomic, retain) UIProgressView *audioPower;//音频波动

@property(nonatomic, retain) UIWebView *webView;

@property(nonatomic, assign) BOOL isRecorder;

@end

@implementation RecorderViewController

- (void)dealloc
{
[_L_AVAudio release];
[_player release];
[_imageview release];
[_voView release];
[_backView release];
[_timer release];
[_audioPower release];
[_webView release];
[super dealloc];
}

- (void)viewDidLoad {
[super viewDidLoad];

self.isRecorder = NO;

#pragma mark 创建标题
[self createTitle];

#pragma mark 创建页面
[self createView];

#pragma mark 创建Recorder
[self createRecorder];
}

-(void)createTitle
{
self.imageview = [[UIImageView alloc]init];

UIImageView *image = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"backImage.jpg"]];
image.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height + 20);
[self.view addSubview:image];
[image release];

self.view.backgroundColor = [UIColor colorWithRed:0.614 green:0.508 blue:1.000 alpha:1.000];
self.title = @"录音&播放";
[self.navigationController.navigationBar setTitleTextAttributes:
@{NSFontAttributeName:[UIFont fontWithName:@"Helvetica-Bold" size:22],
NSForegroundColorAttributeName:[UIColor purpleColor]}];
}

-(void)createView
{

NSArray *array = @[@"开始录制", @"停止录制", @"暂停录制", @"开始播放", @"停止播放"];
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 3; j++) {
UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
if (i == 1) {
btn.frame = CGRectMake(70 + j * 135, 450 + i * 70, 100, 50);
}
else
{
btn.frame = CGRectMake(20 + j * 115, 430 + i * 70, 100, 50);
}
if (i == 1 && j == 2) {
}
else
{
[btn setTitle:array[i * 3 + j] forState:UIControlStateNormal];
}
btn.layer.cornerRadius = 5;
[btn setTitleColor:[UIColor purpleColor] forState:UIControlStateNormal];
[self.view addSubview:btn];
btn.tag = 8000 + i * 3 + j;
[btn addTarget:self action:@selector(btnAction:) forControlEvents:UIControlEventTouchUpInside];
}
}
}

-(void)btnAction:(UIButton *)btn
{
if (btn.tag == 8000) {
[self.L_AVAudio record]; //开始录音
[self createBeginView];
// NSLog(@"========%f", self.audioPower.progress);
self.timer.fireDate = [NSDate distantPast]; //开始定时器
self.isRecorder = YES;
}
else if (btn.tag == 8001)
{
[self.L_AVAudio stop]; //停止录音
self.timer.fireDate=[NSDate distantFuture]; //关闭定时器
self.audioPower.progress = 0.0;
}
else if (btn.tag == 8002)
{
[self.L_AVAudio pause]; //暂停录音 (0.25)
self.timer.fireDate=[NSDate distantFuture];
// NSLog(@"%@", self.timer.fireDate);
}
else if (btn.tag == 8003)
{
if (self.isRecorder) {
//开始播放
NSString *path = [[NSString alloc] initWithFormat:@"%@/%@", NSTemporaryDirectory(), @"test"];
NSLog(@"%@", path);
self.player = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:nil];
self.player.delegate = self;
[self.player prepareToPlay];
[self.player play];

// 设定位置和大小
CGRect frame = CGRectMake(80,130,0,0);
frame.size = [UIImage imageNamed:@"u=3572879117,3580921531&fm=21&gp=0.jpg.gif"].size;
// 读取gif图片数据
NSData *gif = [NSData dataWithContentsOfFile: [[NSBundle mainBundle] pathForResource:@"u=3572879117,3580921531&fm=21&gp=0.jpg" ofType:@"gif"]];
// view生成
self.webView = [[UIWebView alloc] initWithFrame:frame];
self.webView.userInteractionEnabled = NO;//用户不可交互
[self.webView loadData:gif MIMEType:@"image/gif" textEncodingName:nil baseURL:nil];
[self.view addSubview:self.webView];
[self.webView release];
}
}
else
{
if (self.isRecorder) {

[self.player stop]; //停止播放
self.webView.hidden = YES;
self.backView.hidden = YES;
self.voView.hidden = YES;
self.imageview.image = [UIImage imageNamed:@"playStop"];
}
}

}

-(void)createBeginView
{
self.imageview.image = [UIImage imageNamed:@"beginrecording"];
self.imageview.frame = CGRectMake(80,130,220,220);
[self.view addSubview:self.imageview];

self.backView = [[UIView alloc]initWithFrame:CGRectMake(140, 325, 110, 10)];
self.backView.backgroundColor = [UIColor whiteColor];
[self.view addSubview:self.backView];

self.voView = [[UIView alloc]init];
self.voView.backgroundColor = [UIColor purpleColor];
[self.view addSubview:self.voView];

}

//录音声波监控定制器
-(NSTimer *)timer{

if (!_timer) {
_timer=[NSTimer scheduledTimerWithTimeInterval:0.1f target:self selector:@selector(audioPowerChange) userInfo:nil repeats:YES];
}
return _timer;
}

-(void)audioPowerChange{
[self.L_AVAudio updateMeters];//更新测量值
float power= [self.L_AVAudio averagePowerForChannel:0];//取得第一个通道的音频,注意音频强度范围时-160到0
CGFloat progress=(1.0 / 160.0) * (power + 160.0);
NSLog(@"%f", progress);
self.voView.frame = CGRectMake(140, 325, progress * 100, 10);
[self.audioPower setProgress:progress];
}


-(void)createRecorder
{
//AVAudioSession是用来控制audio会话的,控制其是用来录音还是播放等等功能

//标明此次会话是录音+播放
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];
[[AVAudioSession sharedInstance] setActive:YES error:nil];

//配置recoder
NSError *error = nil;
NSMutableDictionary *settings = [[NSMutableDictionary alloc] init];
//设置录音格式
[settings setObject:[NSNumber numberWithInt:
kAudioFormatiLBC] forKey:AVFormatIDKey];
//设置录音采样率,8000是电话采样率,对于一般录音已经够了
[settings setObject:[NSNumber numberWithFloat:8000] forKey:AVSampleRateKey];
//设置通道 单通道
[settings setObject:[NSNumber numberWithInt:1] forKey:AVNumberOfChannelsKey];
//设置采样点位数:8 16 24 32
[settings setObject:[NSNumber numberWithInt:16] forKey:AVLinearPCMBitDepthKey];
// [settings setObject:[NSNumber numberWithBool:NO] forKey:AVLinearPCMIsBigEndianKey];
//是否使用浮点数采样
[settings setObject:[NSNumber numberWithBool:NO] forKey:AVLinearPCMIsFloatKey];

//录音文件保存地址
NSString *path = [[NSString alloc] initWithFormat:@"%@/%@", NSTemporaryDirectory(), @"test"];
self.L_AVAudio = [[AVAudioRecorder alloc] initWithURL:[NSURL URLWithString:path] settings:settings error:&error];
self.L_AVAudio.delegate = self;

//配置号recoder并且创建录音文件
if ([self.L_AVAudio prepareToRecord]) {
NSLog(@"Prepare successful");
}
else
{
NSLog(@"Prepare fail");
}

self.L_AVAudio.meteringEnabled=YES;//如果要监控声波则必须设置为YES
}

-(void)audioRecorderDidFinishRecording:(AVAudioRecorder *)recorder successfully:(BOOL)flag
{
[[AVAudioSession sharedInstance] setActive:NO error:nil];
}


- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
}

@end

0 0