iOS 之录音笔,AVAudioRecorder,AVAudioPlayer的使用

发个广告:iOS开发两年了,一步步走来,从小白到大白,有自己的新的体验  关注公众号一起进步,有技术、工具分享



无意中找到一篇文章 觉得简洁易懂,在这整理下留待回看

在iOS的基础类库中, 提供了AVFoundationFrameWork,即Audio/Video基础类库,通过使用这个类库,可以非常容易的在应用程序录制,播放视频,音频等。本文将通过一个简单的录音笔应用,介绍如何在iOS应用程序中使用AVAudioRecorder,AVAudioPlayer。录音笔的界面以及功能都非常简单,如下: 1.当程序启动时,界面会出现录音按钮。 2.用户点击录音按钮,按钮变色,进入录音状态。 3.录音状态下,用户点击录音按钮,录音结束,播放按钮出现 4.用户点击播放按钮,进入播放录音状态,播放录音时,录音按钮不可用。 下面就来一步一步的实现这个简单的录音笔应用: 首先,新起项目,并把AVFoundationFrameWork加入到当前项目中: 然后,创建MainViewController,并引入AVFoundation.h文件,创建AVAduioPlayer和AVAudioRecorder属性,以及界面元素需要的属性,同时定义点击按钮时需要使用的方法: 

Object-c代码  

  1. #import   
  • #import   
  •   
  • @interface MainViewController : UIViewController  
  •   
  • @property (strong, nonatomic) AVAudioRecorder *audioRecorder;  
  • @property (strong, nonatomic) AVAudioPlayer *audioPlayer;  
  •   
  • @property (nonatomic, weak) IBOutlet UIButton *recoron;  
  • @property (nonatomic, weak) IBOutlet UIButton *playButton;  
  •   
  • -(IBAction)recoronAction:(id)sender;  
  • -(IBAction)playButtonAction:(id)sender;  
  •   
  • @end  

``` 

接着,把UI元素和响应的属性,方法绑定起来: 

再接下来,在界面加载(viewDidLoad)的时候,隐藏播放按钮并初始化AvdudioRecorder,初始化Recorder需要2个元素: 

*录制效果配置,主要就是配置录制声音时的比特率,采样率等等,更多具体的内容:[Audio配置]

http://developer.apple.com/library/ios/#DOCUMENTATION/AVFoundation/Reference/AVFoundationAudioSettings_Constants/Reference/reference.html#//apple_ref/doc/uid/TP40009937

* 录音保存的文件URL 

初始化后,调用[self.audioRecorderprepareToRecord]方法,该方法会配置好Recorder并创建好录音文件。 

Object-c代码  

  1. - (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"

);  

  •         }  
  •     }      
  • }  

配置好Recorder之后,开始,实现录音按钮,录音按钮功能非常简单,只需要判断当前Recorder处于录音状态则调用stop方法结束录音,否则调用record方法开始录音,同时更新UI元素。 

Object-c代码  

  1. -(IBAction)recoronAction:(id)sender  
  • {  
  •     if (!self.audioRecorder.recording) {  
  •         self.playButton.hidden = YES;  
  •         [self.audioRecorder record];  
  •         [self.recoron setImage:[UIImage imageNamed:@"MicButtonPressed.png"

] forState:UIControlStateNormal];  

  •     }else {  
  •         self.playButton.hidden = NO;  
  •         [self.audioRecorder stop];  
  •         [self.recoron setImage:[UIImage imageNamed:@"MicButton.png"

] forState:UIControlStateNormal];  

  •     }  
  • }  

录音结束之后,播放按钮会出现,接下来实现播放按钮的点击效果,其实现和Record按钮差不多,判断当前的Player处于播放状态则调用pause方法停止播放,否则,初始化Player,然后调用play方法播放按钮。AVAudioPlayer的初始化非常简单,只需要知道声音文件的URL即可。 

Object-c代码  

  1. -(IBAction)playButtonAction:(id)sender  
  • {  
  •     if (!self.audioPlayer.playing) {  
  •         self.recoron.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.recoron.hidden = NO;  
  •         [self.audioPlayer pause];  
  •         [self.playButton setImage:[UIImage imageNamed:@"play.png"

] forState:UIControlStateNormal];  

  •     }  
  • }  

当声音文件播放结束时,需要通知主程序,这就涉及到使用AVAudioPlayerDelegate,顺道我们也可以实现AVAudioRecorderDelegate以记录Recorder的状态。 

Object-c代码  

  1. #pragma mark audio delegate  
  • -(void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag  
  • {  
  •     NSLog(@"Finsh playing"

);  

  •     self.recoron.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"

);  

  • }  

That's All!本文只是对AVAudioRecorder,AVAudioPlayer做了最简单的介绍,更多的内容请参考苹果的开发者文档: *AVAudioRecorder:http://developer.apple.com/library/ios/#DOCUMENTATION/AVFoundation/Reference/AVAudioRecorder_ClassReference/Reference/Reference.html#//apple_ref/occ/instp/AVAudioRecorder/settings

* AVAudioPlayer:http://developer.apple.com/library/ios/#DOCUMENTATION/AVFoundation/Reference/AVAudioPlayerClassReference/Reference/Reference.html

另外,这儿还有一篇不错的分析iPhone中使用音频的文章:http://www.raywenderlich.com/zh-hans/20608/iphone开发之音频101-第一部分:-文件和数据类型

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值