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

2023-05-16

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

        

    }];

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

iOS 录音,播放,转码MP3,上传语音文件 的相关文章

随机推荐

  • 用Navicat Premium连接数据库!

    Navicat Premium介绍 Navicat Premium 是一套数据库开发工具 xff0c 让你从单一应用程序中同时连接 MySQL MariaDB MongoDB SQL Server Oracle PostgreSQL 和 S
  • 介绍一款非常好用的截图软件-《Snipaste》

    目录 Snipaste介绍 Snipaste下载 Snipaste功能介绍 总结 Snipaste介绍 非常好用的截图软件 xff0c 一句话 xff0c 非常非常好用 xff0c 比你用过任何的截图软件都好用 xff0c 不好用你顺着网线
  • 推荐一款卸载软件的小工具-《UninstallToo》

    目录 UninstallToo介绍 UninstallToo下载 UninstallToo使用 总结 UninstallToo介绍 Uninstall Tool 是一款可以用来替代 添加 删除程序 的工具 它允许您显示隐藏的安装程序 xff
  • 【MySQL】下载(超详细教程)

    目录 First 下载 Second 安装 Third 检测是否安装 Last 总结 First 下载 首先 xff0c 我们一步一步跟着我的操作来 xff0c 不能越步骤 xff0c 很容易报错 xff0c 就芭比Q了 第一步直接进入这个
  • 【ASP. Net Mvc】毕设之【在线考试项目】

    前提 这个项目是毕设 xff0c 是用asp net mvc和SQL server数据库完成的 xff0c 分为前端和后台 后台功能 xff1a 老师添加试卷 xff0c 上传试卷 xff0c 审核试卷 xff0c 管理学生 前端功能 xf
  • 继承——Person为父类,Teacher和Student都继承Person

    一 题目 按照要求完成以下操作 创建Person xff0c Teacher xff0c Student类 其中 xff0c Person为父类 xff0c Teacher和Student都继承Person Person中有属性 xff1a
  • c语言求数组中10 个整数中最大值

    c语言求数组中10 个整数中最大值 要求在数组中输入10个整数 xff0c 输出最大值 这里先用一种简单的方法 xff0c 创建一个变量max xff1d 0 xff0c 用max与这10个数依次比较 xff0c 如果比max大就把它的值赋
  • c语言详细解答辗转相除法求两个数的最小公倍数

    C语言详细解答辗转相除法求两个数的最小公倍数 1 辗转相除法的用法 最大公约数 辗转相除法是用一个大的数除以一个小的数 xff0c 如果有余数 xff0c 就用被除数 余数 xff0c 如果还有余数就继续用 xff08 上一个公式的 被除数
  • Linux 嵌入式 笔记 NFS网络文件系统

    文章目录 Linux 嵌入式 笔记 提示 xff1a 写完文章后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 文章目录 文章目录前言一 nfs 相关命令二 原理1 第一点2 第二点 总结 前言 注意 xff1a
  • linux下cpu锁定频率以及频率设置

    linux下cpu锁定频率以及频率设置 环境如下 ubuntu22 04cpu为5700g 前期准备 使用工具为 xff1a cpufrequtils span class token function sudo span span cla
  • CentOS7安装xrdp(windows远程桌面连接linux)

    前提 CentOS安装桌面 xff0c 如果无桌面 xff0c 请执行 xff1a yum y groups install 34 GNOME Desktop 34 startx 方法一 配置源 yum install epel y 安装x
  • Linux CPU超频设置

    查看当前cpu运行频率 xff1a cat proc cpuinfo grep i cpu mhz 开始设置 xff1a cpupower c all frequency set g performance 或者 cpupower freq
  • Ozone调试经验总结

    如何查看内存 view gt memory打开内存窗口即可查看 如何读写内存 Target ReadU32 addr Target WriteU32 addr value 遇到不会的 xff0c 可以使用help命令找找看
  • 元宇宙创作者必备技能TouchDesigner

    元宇宙的资源清单又更新啦 github com shadowcz007 awesome metaverse 感谢ML211 提供线索metaworld app 感谢ML1462 提供线索 The Sims Resource opus Git
  • 栈的入栈和出栈的顺序规律

    栈的入栈和出栈的顺序规律是先进后出 xff0c 所以出栈的可能数目跟入栈的可能排列数目是一致的 a的出入有2中可能 xff0c b的出入有2种可能 xff0c c的出入有2种可能 xff0c d只需要关系入 xff0c 只有一种可能 所以出
  • TCP和UDP协议发送数据包的大小

    在进行UDP编程的时候 我们最容易想到的问题就是 一次发送多少bytes好 当然 这个没有唯一答案 xff0c 相对于不同的系统 不同的要求 其得到的答案是不一样的 这里仅对像ICQ一类的发送聊天消息的情况作分析 xff0c 对于其他情况
  • Nodejs开发:如何让node app的程序一直运行?

    情境 运行nodejs的程序 xff0c 使用命令 xff1a node xxx js xff0c 但是关掉终端 xff0c 程序也关闭了 xff0c 如何让node app的程序一直运行 xff1f 解决 1 安装forever npm
  • Godot基础教程02:全都是节点

    在这里先劝退一波人 xff1a 本教程只会涉及2D内容 xff0c 不会涉及3D内容 创建节点 接上一章 xff0c 在左侧的场景面板中 xff0c 可以看到 xff1a 由于本教程只讲2D内容 xff0c 所以这里我们应该选择2D场景 x
  • docker安装gitlab-ce镜像,使用其他端口,亲测可用

    首先鄙视一下那些直接复制粘贴当自己博文的 xff0c 误导别人 xff0c 害我改了好久T T 安装步骤 xff1a 创建数据目录 mkdir p data gitlab config mkdir p data gitlab logs mk
  • iOS 录音,播放,转码MP3,上传语音文件

    语音文件 AVAudioRecorder recorder NSTimer timer NSString urlPlay BOOL isPlay pragma mark 61 61 61 61 61 61 61 61 61 语音文件 61