iOS 录音,播放,转码MP3,上传语音文件

来源:互联网 发布:全国社区网络春晚 编辑:程序博客网 时间:2024/05/16 12:30
//语音文件 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);            }];

0 0
原创粉丝点击