zoukankan      html  css  js  c++  java
  • iOS 录音,播放,转码MP3,上传语音文件

     //语音文件
     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);

            

        }];

     
     
  • 相关阅读:
    post请求返回404
    启动网关服务报错 Unable to find GatewayFilterFactory with name RequestRateLimiter
    数据库远程连接linux报错2003 can't connect to MySQL server on ip (0) 防火墙没有开放端口3306
    idea下maven项目打包部署到tomcat服务器
    修改Idea背景色
    20种源代码测试工具
    作为一名测试工程师,需要具备哪些能力
    Android自动化测试工具——monkey简介及入门
    appium关于定位元素
    appium testcase2
  • 原文地址:https://www.cnblogs.com/cfl911014/p/5253820.html
Copyright © 2011-2022 走看看