iOS录制语音and播放语音开发

产品设计时,有个需求就是本地录制一段话,并且上传给服务器,上传完成点击还要播放这段话,类似微信录制短语音聊天功能

 一、录音初始化

  语音录制前的各种初始化了

- (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格式。网上可以找找。。。

 

posted @ 2016-04-15 15:52  我的style  阅读(452)  评论(0编辑  收藏  举报