使用AVAudioRecorder,AVAudioPlayer构建简单录音笔应用
在iOS的基础类库中, 提供了AVFoundation FrameWork,即Audio/Video基础类库,通过使用这个类库,可以非常容易的在应用程序录制,播放视频,音频等。本文将通过一个简单的录音笔应用,介绍如何在iOS应用程序中使用AVAudioRecorder,AVAudioPlayer。录音笔的界面以及功能都非常简单,如下:
1. 当程序启动时,界面会出现录音按钮。
2. 用户点击录音按钮,按钮变色,进入录音状态。
3. 录音状态下,用户点击录音按钮,录音结束,播放按钮出现
4. 用户点击播放按钮,进入播放录音状态,播放录音时,录音按钮不可用。
下面就来一步一步的实现这个简单的录音笔应用:
首先,新起项目,并把AVFoundation FrameWork加入到当前项目中:
然后,创建MainViewController,并引入AVFoundation.h文件,创建AVAduioPlayer和AVAudioRecorder属性,以及界面元素需要的属性,同时定义点击按钮时需要使用的方法:
#import <UIKit/UIKit.h>#import <AVFoundation/AVFoundation.h>@interface MainViewController : UIViewController<AVAudioPlayerDelegate,AVAudioRecorderDelegate>@property (strong, nonatomic) AVAudioRecorder *audioRecorder;@property (strong, nonatomic) AVAudioPlayer *audioPlayer;@property (nonatomic, weak) IBOutlet UIButton *recordButton;@property (nonatomic, weak) IBOutlet UIButton *playButton;-(IBAction)recordButtonAction:(id)sender;-(IBAction)playButtonAction:(id)sender;@end

- (void)viewDidLoad{ [super viewDidLoad]; self.playButton.hidden = YES; //配置Recorder, NSDictionary *recordSetting = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithInt:AVAudioQualityLow],AVEncoderAudioQualityKey, [NSNumber numberWithInt:16],AVEncoderBitRateKey, [NSNumber numberWithInt:2],AVNumberOfChannelsKey, [NSNumber numberWithFloat:44100.0],AVSampleRateKey, nil]; //录音文件保存地址的URL NSURL *url = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/record.caf", [[NSBundle mainBundle] resourcePath]]]; NSError *error = nil; self.audioRecorder = [[ AVAudioRecorder alloc] initWithURL:url settings:recordSetting error:&error]; if (error != nil) { NSLog(@"Init audioRecorder error: %@",error); }else{ //准备就绪,等待录音,注意该方法会返回Boolean,最好做个成功判断,因为其失败的时候无任何错误信息抛出 if ([self.audioRecorder prepareToRecord]) { NSLog(@"Prepare successful"); } } }-(IBAction)recordButtonAction:(id)sender{ if (!self.audioRecorder.recording) { self.playButton.hidden = YES; [self.audioRecorder record]; [self.recordButton setImage:[UIImage imageNamed:@"MicButtonPressed.png"] forState:UIControlStateNormal]; }else { self.playButton.hidden = NO; [self.audioRecorder stop]; [self.recordButton setImage:[UIImage imageNamed:@"MicButton.png"] forState:UIControlStateNormal]; }}-(IBAction)playButtonAction:(id)sender{ if (!self.audioPlayer.playing) { self.recordButton.hidden = YES; NSError *error; NSLog(@"%@",self.audioRecorder.url); self.audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:self.audioRecorder.url error:&error]; self.audioPlayer.delegate = self; if (error != nil) { NSLog(@"Wrong init player:%@", error); }else{ [self.audioPlayer play]; } [self.playButton setImage:[UIImage imageNamed:@"pause.png"] forState:UIControlStateNormal]; }else { self.recordButton.hidden = NO; [self.audioPlayer pause]; [self.playButton setImage:[UIImage imageNamed:@"play.png"] forState:UIControlStateNormal]; }}#pragma mark audio delegate-(void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag{ NSLog(@"Finsh playing"); self.recordButton.hidden = NO; [self.playButton setImage:[UIImage imageNamed:@"play.png"] forState:UIControlStateNormal]; }-(void)audioPlayerDecodeErrorDidOccur:(AVAudioPlayer *)player error:(NSError *)error{ NSLog(@"Decode Error occurred");}-(void)audioRecorderDidFinishRecording:(AVAudioRecorder *)recorder successfully:(BOOL)flag{ NSLog(@"Finish record!");}-(void)audioRecorderEncodeErrorDidOccur:(AVAudioRecorder *)recorder error:(NSError *)error{ NSLog(@"Encode Error occurred");}