打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
iOS 录音,播放,转码MP3,上传语音文件
  1. //语音文件  
  2.  AVAudioRecorder *recorder;  
  3.  NSTimer *timer;  
  4.  NSString *urlPlay;  
  5.  BOOL isPlay;  
  6.    
  7.      
  8. #pragma mark  ========= 语音文件 ==========  
  9. - (void)audio  
  10. {  
  11.     AVAudioSession *a=[AVAudioSession sharedInstance];  
  12.     [a setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];  
  13.     [a setActive:YES error:nil];  
  14.     //录音设置  
  15.     NSMutableDictionary *recordSetting = [[NSMutableDictionary alloc] init];  
  16.     //录音格式 无法使用  
  17.     [recordSetting setValue :[NSNumber numberWithInt:kAudioFormatLinearPCM] forKey: AVFormatIDKey];  
  18.     //采样率  
  19.     [recordSetting setValue :[NSNumber numberWithFloat:44100] forKey: AVSampleRateKey];//44100.0  
  20.     //通道数  
  21.     [recordSetting setValue :[NSNumber numberWithInt:2] forKey: AVNumberOfChannelsKey];  
  22.     //线性采样位数  
  23.     [recordSetting setValue :[NSNumber numberWithInt:16] forKey: AVLinearPCMBitDepthKey];  
  24.     //音频质量,采样质量  
  25.     [recordSetting setValue:[NSNumber numberWithInt:AVAudioQualityMin] forKey:AVEncoderAudioQualityKey];  
  26.      
  27.     NSString *strUrl = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];  
  28.     urlPlay = [NSString stringWithFormat:@"%@/lll.lpcm", strUrl];  
  29.      
  30.      
  31.     NSError *error;  
  32.     //初始化  
  33.     recorder = [[AVAudioRecorder alloc]initWithURL:[NSURL URLWithString:urlPlay] settings:recordSetting error:&error];  
  34.     //开启音量检测  
  35.     recorder.meteringEnabled = YES;  
  36.     recorder.delegate = self;  
  37.      
  38. }  
  39.   
  40.   
  41. //开始录音  
  42. - (IBAction)speak_touchDown:(id)sender {  
  43.     if(isPlay==NO){  
  44.         _speakBackView.frame=CGRectMake(ScreenWidth/2-75,ScreenHeight/2-130,150, 150);  
  45.         _speakBackView.backgroundColor=[UIColor colorWithWhite:0.000 alpha:0.6];  
  46.         _speakBackView.layer.cornerRadius=10;  
  47.         _speakBackView.clipsToBounds=YES;  
  48.         [self.view addSubview:_speakBackView];  
  49.          
  50.         //创建录音文件,准备录音  
  51.         if ([recorder prepareToRecord]) {  
  52.             //开始  
  53.             [recorder record];  
  54.         }  
  55.         //设置定时检测  
  56.         timer = [NSTimer scheduledTimerWithTimeInterval:0 target:self selector:@selector(detectionVoice) userInfo:nil repeats:YES];  
  57.     }  
  58. }  
  59.   
  60. //拖动取消录音  
  61. - (IBAction)speak_drag:(id)sender {  
  62.      
  63.     if(isPlay==NO){  
  64.         [_speakBackView removeFromSuperview];  
  65.         //删除录制文件  
  66.         [recorder deleteRecording];  
  67.         [recorder stop];  
  68.         [timer invalidate];  
  69.     }  
  70. }  
  71.   
  72. //录音完成  
  73. - (IBAction)speak_touchUpinset:(id)sender {  
  74.     [timer invalidate];  
  75.     if (isPlay==NO) {  
  76.         [_speakBackView removeFromSuperview];  
  77.         double cTime = recorder.currentTime;  
  78.         if (cTime > 1) {//如果录制时间<2 不发送  
  79.             NSLog(@"发出去");  
  80.             //显示录音时间  
  81.             [_btn_speak setTitle:[NSString stringWithFormat:@"%.1lf\" 播放",cTime] forState:UIControlStateNormal];  
  82.              
  83.             //录音时候的标志  
  84.             UIImage *image=[UIImage imageNamed:@"speak_read"];  
  85.             image=[image imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];  
  86.             [_btn_speak setImage:image forState:UIControlStateNormal];  
  87.             _btn_cancelSpeak.hidden=NO;  
  88.             isPlay=YES;  
  89.    
  90.                     //新开线程进行解码  
  91.             [NSThread detachNewThreadSelector:@selector(audio_PCMtoMP3) toTarget:self withObject:nil];  
  92.         }else {  
  93.             //删除记录的文件  
  94.             [recorder deleteRecording];  
  95.         }  
  96.         [recorder stop];  
  97.     }  
  98.     //点击时候播放与暂停  
  99.     else{  
  100.         if (self.avPlay.playing) {  
  101.             [_btn_speak setTitle:[NSString stringWithFormat:@"%.1lf\" 播放",_avPlay.duration] forState:UIControlStateNormal];  
  102.             [self.avPlay stop];  
  103.             return;  
  104.         }  
  105.         [_btn_speak setTitle:@"暂停" forState:UIControlStateNormal];  
  106.         AVAudioPlayer *player = [[AVAudioPlayer alloc]initWithContentsOfURL:[NSURL URLWithString:urlPlay] error:nil];  
  107.         self.avPlay = player;  
  108.         self.avPlay.delegate=self;  
  109.         [self.avPlay prepareToPlay];  
  110.         [self.avPlay play];  
  111.          NSLog(@"%f",_avPlay.duration);  
  112.     }  
  113. }  
  114.   
  115. //删除录音文件  
  116. - (IBAction)cancelSpeak:(id)sender {  
  117.     [_avPlay stop];  
  118.      _saveModel.speakUrl=nil;  
  119.     [recorder deleteRecording];  
  120.     isPlay=NO;  
  121.     _btn_cancelSpeak.hidden=YES;  
  122.     [_btn_speak setTitle:@"按住  说话" forState:UIControlStateNormal];  
  123.     [_btn_speak setImage:nil forState:UIControlStateNormal];  
  124. }  
  125.   
  126. - (void)detectionVoice  
  127. {  
  128.     [recorder updateMeters];//刷新音量数据  
  129.     //获取音量的平均值  [recorder averagePowerForChannel:0];  
  130.     //音量的最大值  [recorder peakPowerForChannel:0];  
  131.     double lowPassResults = pow(10, (0.05 * [recorder peakPowerForChannel:0]));  
  132.     NSLog(@"%lf",lowPassResults);  
  133.     if(0<lowPassResults&&lowPassResults<=0.125) {  
  134.         [_speak_iamgeV setImage:[UIImage imageNamed:@"record_animate_01"]];  
  135.     }else if (0.125<lowPassResults&&lowPassResults<=0.25) {  
  136.         [_speak_iamgeV setImage:[UIImage imageNamed:@"record_animate_02"]];  
  137.     }else if (0.25<lowPassResults&&lowPassResults<=0.375) {  
  138.         [_speak_iamgeV setImage:[UIImage imageNamed:@"record_animate_03"]];  
  139.     }else if (0.375<lowPassResults&&lowPassResults<=0.50) {  
  140.         [_speak_iamgeV setImage:[UIImage imageNamed:@"record_animate_04"]];  
  141.     }else if (0.50<lowPassResults&&lowPassResults<=0.625) {  
  142.         [_speak_iamgeV setImage:[UIImage imageNamed:@"record_animate_05"]];  
  143.     }else if (0.625<lowPassResults&&lowPassResults<=0.75) {  
  144.         [_speak_iamgeV setImage:[UIImage imageNamed:@"record_animate_06"]];  
  145.     }else if (0.75<lowPassResults&&lowPassResults<=0.875) {  
  146.         [_speak_iamgeV setImage:[UIImage imageNamed:@"record_animate_07"]];  
  147.     }else {  
  148.         [_speak_iamgeV setImage:[UIImage imageNamed:@"record_animate_08"]];  
  149.     }  
  150. }  
  151. - (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag{  
  152.     [_btn_speak setTitle:[NSString stringWithFormat:@"%.1lf\" 播放",_avPlay.duration] forState:UIControlStateNormal];  
  153. }  
  154.   
  155.   
  156.   
  157.   
  158.   
  159. #pragma mark ===== 转换成MP3文件=====  
  160. - (void)audio_PCMtoMP3  
  161. {  
  162.     NSString *strUrl = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];  
  163.      
  164.     //NSString *mp3FileName = [strUrl lastPathComponent];  
  165.     //mp3FileName = [mp3FileName stringByAppendingString:@".mp3"];  
  166.     NSString *mp3FilePath = [strUrl stringByAppendingPathComponent:@"lll.mp3"];  
  167.      
  168.     @try {  
  169.         int read, write;  
  170.          
  171.         FILEFILE *pcm = fopen([urlPlay cStringUsingEncoding:1], "rb");  //source 被转换的音频文件位置  
  172.         fseek(pcm, 4*1024, SEEK_CUR);                                   //skip file header  
  173.         FILEFILE *mp3 = fopen([mp3FilePath cStringUsingEncoding:1], "wb");  //output 输出生成的Mp3文件位置  
  174.          
  175.         const int PCM_SIZE = 8192;  
  176.         const int MP3_SIZE = 8192;  
  177.         short int pcm_buffer[PCM_SIZE*2];  
  178.         unsigned char mp3_buffer[MP3_SIZE];  
  179.          
  180.         lame_t lame = lame_init();  
  181.         lame_set_in_samplerate(lame, 44100);  
  182.         lame_set_VBR(lame, vbr_default);  
  183.         lame_init_params(lame);  
  184.          
  185.         do {  
  186.             read = fread(pcm_buffer, 2*sizeof(short int), PCM_SIZE, pcm);  
  187.             if (read == 0)  
  188.                 write = lame_encode_flush(lame, mp3_buffer, MP3_SIZE);  
  189.             else  
  190.                 write = lame_encode_buffer_interleaved(lame, pcm_buffer, read, mp3_buffer, MP3_SIZE);  
  191.              
  192.             fwrite(mp3_buffer, write, 1, mp3);  
  193.              
  194.         } while (read != 0);  
  195.          
  196.         lame_close(lame);  
  197.         fclose(mp3);  
  198.         fclose(pcm);  
  199.     }  
  200.     @catch (NSException *exception) {  
  201.         NSLog(@"%@",[exception description]);  
  202.     }  
  203.     @finally {  
  204.         strUrl = mp3FilePath;  
  205.         _saveModel.speakUrl=[NSURL URLWithString:strUrl];  
  206.         NSLog(@"MP3生成成功: %@",strUrl);  
  207.     }  
  208.      
  209. }  
  210.    
  211. #pragma mark  ========= 上传 ==========  
  212.  [self.httpMgr POST:@"http://xuyingtest.sinaapp.com/uploadfile.php" parameters:nilconstructingBodyWithBlock:^ void(id<AFMultipartFormData> formData) {  
  213.   
  214.           
  215.   
  216.         [formData appendPartWithFileURL:self.audioReorder.url name:@"file" error:nil];  
  217.   
  218.           
  219.   
  220.     } success:^ void(AFHTTPRequestOperation * operation, id responseObject) {  
  221.   
  222.         NSDictionary *dict=[NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingAllowFragments error:nil];  
  223.   
  224.         if (dict[@"error"]) {  
  225.   
  226.             NSLog(@" up success error :%@",dict[@"error"]);  
  227.   
  228.         }  
  229.   
  230.         else  
  231.   
  232.         {  
  233.   
  234.             NSLog(@"upload file ok!:%@",dict[@"success"]);  
  235.   
  236.         }  
  237.   
  238.           
  239.   
  240.     } failure:^void(AFHTTPRequestOperation * operation, NSError * error) {  
  241.   
  242.         NSLog(@"%@",error.localizedDescription);  
  243.   
  244.           
  245.   
  246.     }];  

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
iOS开发
IOS AVFoundation的录音与播放
实例编程iPhone 录音和播放
IOS 序列化与反序列化 NSKeyedUnarchiver
文件加载与保存
用Swift编写网络层:面向协议方式
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服