产品设计时,有个需求就是本地录制一段话,并且上传给服务器,上传完成点击还要播放这段话,类似微信录制短语音聊天功能
一、录音初始化
语音录制前的各种初始化了
- (void)audio
{
//录音设置
NSMutableDictionary *recordSetting = [[NSMutableDictionary alloc]init];
//设置录音格式 AVFormatIDKey==kAudioFormatLinearPCM
[recordSetting setValue:[NSNumber numberWithInt:kAudioFormatLinearPCM] forKey:AVFormatIDKey];
//设置录音采样率(Hz) 如:AVSampleRateKey==8000/44100/96000(影响音频的质量)
[recordSetting setValue:[NSNumber numberWithFloat:96000] forKey:AVSampleRateKey];
//录音通道数 1 或 2
[recordSetting setValue:[NSNumber numberWithInt:1] forKey:AVNumberOfChannelsKey];
//线性采样位数 8、16、24、32
[recordSetting setValue:[NSNumber numberWithInt:16] forKey:AVLinearPCMBitDepthKey];
//录音的质量
[recordSetting setValue:[NSNumber numberWithInt:AVAudioQualityHigh] forKey:AVEncoderAudioQualityKey];
NSString *strUrl = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSURL *url = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/voice.caf", strUrl]];
//语音录制完成后存放在本地,我们将该本地路径赋值给我们全局定义好的NSURL类型的voiceUrl
self.voiceUrl = url;
NSError *error;
//初始化
self.recorder = [[AVAudioRecorder alloc]initWithURL:url settings:recordSetting error:&error];
//开启音量检测
self.recorder.meteringEnabled = YES;
self.recorder.delegate = self;
AVAudioSession *session = [AVAudioSession sharedInstance];
[session setCategory:AVAudioSessionCategoryPlayAndRecord error:&error];
[session setActive:YES error:&error];
}
二、录制语音与上传
一般都是长按某个按钮来完成语音录制,那最基本的我们就从长按按钮说起
[self.pressBtn addTarget:self action:@selector(btnDown:) forControlEvents:UIControlEventTouchDown];//接触按钮执行
[self.pressBtn addTarget:self action:@selector(btnUp:) forControlEvents:UIControlEventTouchUpInside];//录制完成执行
[self.pressBtn addTarget:self action:@selector(btnDragUp:) forControlEvents:UIControlEventTouchDragExit];//录制过程中向上滑动放弃录制
- (void)btnDown:(id)sender
{
[SVProgressHUD showWithStatus:@"正在录音"];
//创建录音文件,准备录音
if ([self.recorder prepareToRecord]) {
//开始录制
[self.recorder record];
}
//设置NSTimer定时检测,刷新音量数据
self.timer = [NSTimer scheduledTimerWithTimeInterval:0 target:self selector:@selector(detectionVoice) userInfo:nil repeats:YES];
}
- (void)btnUp:(id)sender
{
[SVProgressHUD dismiss];
if (self.recorder.currentTime > 2) {//如果录制时间<2s 不发送
[self.recorder deleteRecording];
//服务器上传文件
这里看接口需求,录制的语音已经放到之前语音初始化说的voiceUrl中了,就等你处理了
}else {
//说话事件太短,要删除记录的文件
[self.recorder deleteRecording];
}
[self.recorder stop];
[self.timer invalidate];
}
- (void)btnDragUp:(id)sender
{
[SVProgressHUD dismiss];
//删除录制文件
[self.recorder deleteRecording];
[self.recorder stop];
[self.timer invalidate];
}
- (void)detectionVoice
{
[self.recorder updateMeters];//刷新音量数据
}
三、语音播放
语音播报包括播报本地音频,还包括播放一个Url音频
[self.playBtn addTarget:self action:@selector(playVoice) forControlEvents:UIControlEventTouchUpInside];
播放一个本地音频
-(void)playVoice
{
//刚录制完成,只需要从本地拿到路径就好
AVAudioPlayer *player = [[AVAudioPlayer alloc]initWithContentsOfURL:self.voiceUrl error:nil];
self.avPlay = player;
[self.avPlay play];
}
播放一个Url音频(因为我们已经上传成功了,那么有些情况下我们可能拿到这段音频对应的是一个Url)
这里语音播放我们用MPMoviePlayerController这个系统类 当然得包含文件#import <MediaPlayer/MediaPlayer.h>
MPMoviePlayerController *mediaPlay=[[MPMoviePlayerController alloc]init];
mediaPlay.contentURL=[NSURL URLWithString:语音Url];
[mediaPlay play];
四、常见语音录制格式问题
我们在初识话的时候看到设置的是kAudioFormatLinearPCM格式。有时候需要我们转为mp3格式再传给服务器端
有个第三方库lame.h可以将语音文件转为mp3格式。网上可以找找。。。