//语音文件 AVAudioRecorder *recorder; NSTimer *timer; NSString *urlPlay; BOOL isPlay; #pragma mark ========= 语音文件 ========== - (void)audio { AVAudioSession *a=[AVAudioSession sharedInstance]; [a setCategory:AVAudioSessionCategoryPlayAndRecord error:nil]; [a setActive:YES error:nil]; //录音设置 NSMutableDictionary *recordSetting = [[NSMutableDictionary alloc] init]; //录音格式 无法使用 [recordSetting setValue :[NSNumber numberWithInt:kAudioFormatLinearPCM] forKey: AVFormatIDKey]; //采样率 [recordSetting setValue :[NSNumber numberWithFloat:44100] forKey: AVSampleRateKey];//44100.0 //通道数 [recordSetting setValue :[NSNumber numberWithInt:2] forKey: AVNumberOfChannelsKey]; //线性采样位数 [recordSetting setValue :[NSNumber numberWithInt:16] forKey: AVLinearPCMBitDepthKey]; //音频质量,采样质量 [recordSetting setValue:[NSNumber numberWithInt:AVAudioQualityMin] forKey:AVEncoderAudioQualityKey]; NSString *strUrl = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; urlPlay = [NSString stringWithFormat:@"%@/lll.lpcm", strUrl]; NSError *error; //初始化 recorder = [[AVAudioRecorder alloc]initWithURL:[NSURL URLWithString:urlPlay] settings:recordSetting error:&error]; //开启音量检测 recorder.meteringEnabled = YES; recorder.delegate = self; } //开始录音 - (IBAction)speak_touchDown:(id)sender { if(isPlay==NO){ _speakBackView.frame=CGRectMake(ScreenWidth/2-75,ScreenHeight/2-130,150, 150); _speakBackView.backgroundColor=[UIColor colorWithWhite:0.000 alpha:0.6]; _speakBackView.layer.cornerRadius=10; _speakBackView.clipsToBounds=YES; [self.view addSubview:_speakBackView]; //创建录音文件,准备录音 if ([recorder prepareToRecord]) { //开始 [recorder record]; } //设置定时检测 timer = [NSTimer scheduledTimerWithTimeInterval:0 target:self selector:@selector(detectionVoice) userInfo:nil repeats:YES]; } } //拖动取消录音 - (IBAction)speak_drag:(id)sender { if(isPlay==NO){ [_speakBackView removeFromSuperview]; //删除录制文件 [recorder deleteRecording]; [recorder stop]; [timer invalidate]; } } //录音完成 - (IBAction)speak_touchUpinset:(id)sender { [timer invalidate]; if (isPlay==NO) { [_speakBackView removeFromSuperview]; double cTime = recorder.currentTime; if (cTime > 1) {//如果录制时间<2 不发送 NSLog(@"发出去"); //显示录音时间 [_btn_speak setTitle:[NSString stringWithFormat:@"%.1lf\" 播放",cTime] forState:UIControlStateNormal]; //录音时候的标志 UIImage *image=[UIImage imageNamed:@"speak_read"]; image=[image imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]; [_btn_speak setImage:image forState:UIControlStateNormal]; _btn_cancelSpeak.hidden=NO; isPlay=YES; //新开线程进行解码 [NSThread detachNewThreadSelector:@selector(audio_PCMtoMP3) toTarget:self withObject:nil]; }else { //删除记录的文件 [recorder deleteRecording]; } [recorder stop]; } //点击时候播放与暂停 else{ if (self.avPlay.playing) { [_btn_speak setTitle:[NSString stringWithFormat:@"%.1lf\" 播放",_avPlay.duration] forState:UIControlStateNormal]; [self.avPlay stop]; return; } [_btn_speak setTitle:@"暂停" forState:UIControlStateNormal]; AVAudioPlayer *player = [[AVAudioPlayer alloc]initWithContentsOfURL:[NSURL URLWithString:urlPlay] error:nil]; self.avPlay = player; self.avPlay.delegate=self; [self.avPlay prepareToPlay]; [self.avPlay play]; NSLog(@"%f",_avPlay.duration); } } //删除录音文件 - (IBAction)cancelSpeak:(id)sender { [_avPlay stop]; _saveModel.speakUrl=nil; [recorder deleteRecording]; isPlay=NO; _btn_cancelSpeak.hidden=YES; [_btn_speak setTitle:@"按住 说话" forState:UIControlStateNormal]; [_btn_speak setImage:nil forState:UIControlStateNormal]; } - (void)detectionVoice { [recorder updateMeters];//刷新音量数据 //获取音量的平均值 [recorder averagePowerForChannel:0]; //音量的最大值 [recorder peakPowerForChannel:0]; double lowPassResults = pow(10, (0.05 * [recorder peakPowerForChannel:0])); NSLog(@"%lf",lowPassResults); if(0<lowPassResults&&lowPassResults<=0.125) { [_speak_iamgeV setImage:[UIImage imageNamed:@"record_animate_01"]]; }else if (0.125<lowPassResults&&lowPassResults<=0.25) { [_speak_iamgeV setImage:[UIImage imageNamed:@"record_animate_02"]]; }else if (0.25<lowPassResults&&lowPassResults<=0.375) { [_speak_iamgeV setImage:[UIImage imageNamed:@"record_animate_03"]]; }else if (0.375<lowPassResults&&lowPassResults<=0.50) { [_speak_iamgeV setImage:[UIImage imageNamed:@"record_animate_04"]]; }else if (0.50<lowPassResults&&lowPassResults<=0.625) { [_speak_iamgeV setImage:[UIImage imageNamed:@"record_animate_05"]]; }else if (0.625<lowPassResults&&lowPassResults<=0.75) { [_speak_iamgeV setImage:[UIImage imageNamed:@"record_animate_06"]]; }else if (0.75<lowPassResults&&lowPassResults<=0.875) { [_speak_iamgeV setImage:[UIImage imageNamed:@"record_animate_07"]]; }else { [_speak_iamgeV setImage:[UIImage imageNamed:@"record_animate_08"]]; } } - (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag{ [_btn_speak setTitle:[NSString stringWithFormat:@"%.1lf\" 播放",_avPlay.duration] forState:UIControlStateNormal]; } #pragma mark ===== 转换成MP3文件===== - (void)audio_PCMtoMP3 { NSString *strUrl = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; //NSString *mp3FileName = [strUrl lastPathComponent]; //mp3FileName = [mp3FileName stringByAppendingString:@".mp3"]; NSString *mp3FilePath = [strUrl stringByAppendingPathComponent:@"lll.mp3"]; @try { int read, write; FILE *pcm = fopen([urlPlay cStringUsingEncoding:1], "rb"); //source 被转换的音频文件位置 fseek(pcm, 4*1024, SEEK_CUR); //skip file header FILE *mp3 = fopen([mp3FilePath cStringUsingEncoding:1], "wb"); //output 输出生成的Mp3文件位置 const int PCM_SIZE = 8192; const int MP3_SIZE = 8192; short int pcm_buffer[PCM_SIZE*2]; unsigned char mp3_buffer[MP3_SIZE]; lame_t lame = lame_init(); lame_set_in_samplerate(lame, 44100); lame_set_VBR(lame, vbr_default); lame_init_params(lame); do { read = fread(pcm_buffer, 2*sizeof(short int), PCM_SIZE, pcm); if (read == 0) write = lame_encode_flush(lame, mp3_buffer, MP3_SIZE); else write = lame_encode_buffer_interleaved(lame, pcm_buffer, read, mp3_buffer, MP3_SIZE); fwrite(mp3_buffer, write, 1, mp3); } while (read != 0); lame_close(lame); fclose(mp3); fclose(pcm); } @catch (NSException *exception) { NSLog(@"%@",[exception description]); } @finally { strUrl = mp3FilePath; _saveModel.speakUrl=[NSURL URLWithString:strUrl]; NSLog(@"MP3生成成功: %@",strUrl); } } #pragma mark ========= 上传 ========== [self.httpMgr POST:@"http://xuyingtest.sinaapp.com/uploadfile.php" parameters:nilconstructingBodyWithBlock:^ void(id<AFMultipartFormData> formData) { [formData appendPartWithFileURL:self.audioReorder.url name:@"file" error:nil]; } success:^ void(AFHTTPRequestOperation * operation, id responseObject) { NSDictionary *dict=[NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingAllowFragments error:nil]; if (dict[@"error"]) { NSLog(@" up success error :%@",dict[@"error"]); } else { NSLog(@"upload file ok!:%@",dict[@"success"]); } } failure:^void(AFHTTPRequestOperation * operation, NSError * error) { NSLog(@"%@",error.localizedDescription); }];