- (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;
}else {
//删除记录的文件
[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);
}
[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);
}];