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
- iOS 录音,播放,转码MP3,上传语音文件
- 【iOS开发】AFNetworking上传语音文件(.mp3)到服务器
- iOS 录音,播放并上传
- Android 语音播放和录制以及转换mp3,上传服务器,ios亲测可用
- Android || IOS录制mp3语音文件方法
- Android || IOS录制mp3语音文件方法
- iOS 开发与安卓平台共通 实现录音文件的录制,上传,下载,播放
- 录音播放系统(实现pcm转码mp3,wav)
- iOS 语音类App播放自己的录音完毕后,如何重新继续播放音乐
- ios和安卓上传MP3文件
- Android和IOS录制mp3语音文件的方法
- Android和IOS录制mp3语音文件的方法
- iOS开发通过lame将语音文件转为MP3格式
- 录音(PCM格式)、播放、lame转码成MP3
- iOS录音wav caf 及mp3转码 音频的曲线
- ios 录音播放问题
- iOS录音和播放
- iOS录音和播放
- 软件盘输入法窗口
- JAVA利用HttpClient进行POST请求(HTTPS)
- Linux修改时间,云主机情况下
- Maven环境搭建与在Eclipse中的配置
- 颜色混合
- iOS 录音,播放,转码MP3,上传语音文件
- 命令模式
- 华为15年special offer面经分享
- Hadoop-IPC模型
- innodb锁(一)
- C#写的windows应用程序打包
- 云数据中心网络虚拟化——大二层技术巡礼之控制平面多虚一
- Cookie/Session
- man 3 stat函数翻译