在iOS开发过程中,需要使用到录音功能,需要做的准备工作就是导入#import
首先 将系统的类定义为属性,并且定义一个NSURL类的属性。代码如下
@property(nonatomic,strong)NSURL*url;
@property(nonatomic,strong)AVAudioRecorder*recoder;
@property(nonatomic,strong)AVAudioPlayer*player;
值得注意的是针对NSURL和AVAudioPlayer ,最好进行懒加载,在懒加载中设置相应的属性。代码如下
-(NSURL*)url {
if(_url==nil) {
//在沙盒内创建这样一个文件,来存放录音文件
NSString*tempDir =NSTemporaryDirectory();
NSString*urlPatch = [tempDirstringByAppendingString:@"record.caf"];
_url= [NSURLfileURLWithPath:urlPatch];
}
return_url;
}
-(AVAudioPlayer*)player {
if(_player==nil) {
_player= [[AVAudioPlayeralloc]initWithContentsOfURL:self.urlerror:nil];
_player.volume=1.0;
_player.delegate=self;
}
return_player;
}
其次,在相应的方法内实现开始录音 结束录音,播放录音三个功能。
开始录音
-(void)startRecoder {
//激活AVAudioSession
NSError*error =nil;
AVAudioSession*session = [AVAudioSessionsharedInstance];
[sessionsetCategory:AVAudioSessionCategoryPlayAndRecorderror:&error];
if(session !=nil) {
[sessionsetActive:YESerror:nil];
}else{
NSLog(@"Session error = %@",error);
}
//设置AVAudioRecorder的setting属性
NSDictionary*recoderSettings = [[NSDictionaryalloc]initWithObjectsAndKeys:[NSNumbernumberWithFloat:16000.0],AVSampleRateKey,[NSNumbernumberWithInt:kAudioFormatAppleIMA4],AVFormatIDKey,[NSNumbernumberWithInt:1],AVNumberOfChannelsKey,[NSNumbernumberWithInt:AVAudioQualityMax],AVEncoderAudioQualityKey,nil];
//初始化recodeer对象
self.recoder= [[AVAudioRecorderalloc]initWithURL:self.urlsettings:recoderSettingserror:nil];
//开始录音
[self.recoderrecord];
}
结束录音
-(void)endRecoder { //写在自定义方法内,可进行随意调取。
[self.recoderstop];
self.recoder=nil;
}
播放录音
- (IBAction)AvPlayerAction:(id)sender { //播放录音的点击方法
#pragma mark --设置音频输出源 如果不设置,真机测试过程中默认的是耳机模式。
UInt32sessionCategory =kAudioSessionCategory_MediaPlayback;
AudioSessionSetProperty(kAudioSessionProperty_AudioCategory,sizeof(sessionCategory), &sessionCategory);
UInt32audioRouteOverride =kAudioSessionOverrideAudioRoute_Speaker;
AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryDefaultToSpeaker,sizeof(audioRouteOverride), &audioRouteOverride);
//播放暂停都有方法但是在真机上默认为耳机模式需要设置音频播放的输出源
[self.playerplay];
#pragma mark --但是代码写到这里,在播放录音的过程中,只能播放第一个所以每次播放完,要多播放的类进行释放在代理方法里面设置 步骤是先遵循AVAudioPlayerDelegate代理 设置_player.delegate = self;
}
-(void)audioPlayerDidFinishPlaying:(AVAudioPlayer*)player successfully:(BOOL)flag{ //代理方法
#pragma mark -- iOS的底层是GCC所以也支持__func__相当于打印当前函数名
NSLog(@"%s",__func__);
self.player=nil;
}
针对一些聊天软件的按住说话 然后进行发送录音,在这里也可以实现,具体思路如下:
设置UI控件,在控件上添加长按手势,判断手势的属性 例如:
if(gesture.state==UIGestureRecognizerStateBegan) { //手势刚开始按,打开录音
//开始录音
[selfstartRecoder];
}elseif(gesture.state==UIGestureRecognizerStateEnded) { //手势结束之后,结束录音s
//结束录音
[selfendRecoder];
}
中间遇到一个问题 就是我在进行第二次录音的时候,准备播放录音,但是真机播放的还是第一次录音的文件,怎么处理?
上面已经清楚说明,需要在每次播放完去哪时候,将self.player释放,清除,否则,系统默认为上一个self.player.