iOS 录音转码MP3及转码BASE64上传

一,开始录音

NSLog(@"开始录音");

[self startRecord];

  1. - (void)startRecord
  2. {
  3. //删除上次生成的文件,保留最新文件
  4. NSFileManager *fileManager = [NSFileManager defaultManager];
  5. if ([NSTemporaryDirectory() stringByAppendingString:@"myselfRecord.mp3"]) {
  6. [fileManager removeItemAtPath:[NSTemporaryDirectory() stringByAppendingString:@"myselfRecord.mp3"] error:nil];
  7. }
  8. if ([NSTemporaryDirectory() stringByAppendingString:@"selfRecord.wav"]) {
  9. [fileManager removeItemAtPath:[NSTemporaryDirectory() stringByAppendingString:@"selfRecord.wav"] error:nil];
  10. }
  11.  
  12. //开始录音
  13. //录音设置
  14. NSMutableDictionary *recordSetting = [[NSMutableDictionary alloc] init];
  15. //设置录音格式 AVFormatIDKey==kAudioFormatLinearPCM
  16. [recordSetting setValue:[NSNumber numberWithInt:kAudioFormatLinearPCM] forKey:AVFormatIDKey];
  17. //设置录音采样率(Hz) 如:AVSampleRateKey==8000/44100/96000(影响音频的质量), 采样率必须要设为11025才能使转化成mp3格式后不会失真
  18. [recordSetting setValue:[NSNumber numberWithFloat:11025.0] forKey:AVSampleRateKey];
  19. //录音通道数 1 或 2 ,要转换成mp3格式必须为双通道
  20. [recordSetting setValue:[NSNumber numberWithInt:] forKey:AVNumberOfChannelsKey];
  21. //线性采样位数 8、16、24、32
  22. [recordSetting setValue:[NSNumber numberWithInt:] forKey:AVLinearPCMBitDepthKey];
  23. //录音的质量
  24. [recordSetting setValue:[NSNumber numberWithInt:AVAudioQualityHigh] forKey:AVEncoderAudioQualityKey];
  25.  
  26. //存储录音文件
  27. recordUrl = [NSURL URLWithString:[NSTemporaryDirectory() stringByAppendingString:@"selfRecord.wav"]];
  28.  
  29. //初始化
  30. audioRecorder = [[AVAudioRecorder alloc] initWithURL:recordUrl settings:recordSetting error:nil];
  31. //开启音量检测
  32. audioRecorder.meteringEnabled = YES;
  33. audioSession = [AVAudioSession sharedInstance];//得到AVAudioSession单例对象
  34.  
  35. if (![audioRecorder isRecording]) {
  36. [audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];//设置类别,表示该应用同时支持播放和录音
  37. [audioSession setActive:YES error:nil];//启动音频会话管理,此时会阻断后台音乐的播放.
  38.  
  39. [audioRecorder prepareToRecord];
  40. [audioRecorder peakPowerForChannel:0.0];
  41. [audioRecorder record];
  42. }
  43. }

二,停止录音

[self endRecord];

  1. - (void)endRecord
  2. {
  3. [audioRecorder stop]; //录音停止
  4. [audioSession setActive:NO error:nil]; //一定要在录音停止以后再关闭音频会话管理(否则会报错),此时会延续后台音乐播放
  5. }

三,转码成MP3

  1. - (void)transformCAFToMP3 {
  2. mp3FilePath = [NSURL URLWithString:[NSTemporaryDirectory() stringByAppendingString:@"myselfRecord.mp3"]];
  3.  
  4. @try {
  5. int read, write;
  6.  
  7. FILE *pcm = fopen([[recordUrl absoluteString] cStringUsingEncoding:], "rb"); //source 被转换的音频文件位置
  8. fseek(pcm, *, SEEK_CUR); //skip file header
  9. FILE *mp3 = fopen([[mp3FilePath absoluteString] cStringUsingEncoding:], "wb"); //output 输出生成的Mp3文件位置
  10.  
  11. const int PCM_SIZE = ;
  12. const int MP3_SIZE = ;
  13. short int pcm_buffer[PCM_SIZE*];
  14. unsigned char mp3_buffer[MP3_SIZE];
  15.  
  16. lame_t lame = lame_init();
  17. lame_set_in_samplerate(lame, 11025.0);
  18. lame_set_VBR(lame, vbr_default);
  19. lame_init_params(lame);
  20.  
  21. do {
  22. read = (int)fread(pcm_buffer, *sizeof(short int), PCM_SIZE, pcm);
  23. if (read == )
  24. write = lame_encode_flush(lame, mp3_buffer, MP3_SIZE);
  25. else
  26. write = lame_encode_buffer_interleaved(lame, pcm_buffer, read, mp3_buffer, MP3_SIZE);
  27.  
  28. fwrite(mp3_buffer, write, , mp3);
  29.  
  30. } while (read != );
  31.  
  32. lame_close(lame);
  33. fclose(mp3);
  34. fclose(pcm);
  35. }
  36. @catch (NSException *exception) {
  37. NSLog(@"%@",[exception description]);
  38. }
  39. @finally {
  40. NSLog(@"MP3生成成功");
  41. base64Str = [self mp3ToBASE64];
  42. }
  43. }

四,上传需要转码BASE64

  1. - (NSString *)mp3ToBASE64{
  2. NSData *mp3Data = [NSData dataWithContentsOfFile:[NSTemporaryDirectory() stringByAppendingString:@"myselfRecord.mp3"]];
  3. NSString *_encodedImageStr = [mp3Data base64Encoding];
  4. NSLog(@"===Encoded image:\n%@", _encodedImageStr);
  5. return _encodedImageStr;
  6. }

备注:其中可以直接生成的.caf  .wav    有压缩的MP3需要转格式,不能直接录音生成

【iOS 录音转码MP3及转码BASE64上传】的更多相关文章

  1. iOS开发之网络编程--使用NSURLConnection实现文件上传

    前言:使用NSURLConnection实现文件上传有点繁琐.    本文并没有介绍使用第三方框架上传文件. 正文: 这里先提供用于编码测试的接口:http://120.25.226.186:3281 ...

  2. iOS开发之结合asp.net webservice实现文件上传下载

    iOS开发中会经常用到文件上传下载的功能,这篇文件将介绍一下使用asp.net webservice实现文件上传下载. 首先,让我们看下文件下载. 这里我们下载cnblogs上的一个zip文件.使用N ...

  3. 码云客户端Gitee使用1上传项目

    目前主流的源码仓库有GitHub,这是微软公司的全球最大的代码仓库.里面有来自全世界开发者提供的开源项目或者个人私有项目.它分为个人免费与企业收费两种模式,对于个人学习或者项目开发小组来说个人免费版完 ...

  4. ios开发网络学习五:输出流以及文件上传

    一:输出流 #import "ViewController.h" @interface ViewController ()<NSURLConnectionDataDelega ...

  5. 优化Recorder H5录音:可边录边转码上传服务器,支持微信提供Android IOS Hybrid App源码

    Recorder H5 GitHub开源库随着支持功能的增多,音频转码处理效率渐渐的跟不上需求了,近期抽时间对音频转码部分进行了升级优化,以支持更多实用的功能. 另外IOS的Hybrid App也完成 ...

  6. asp.net+swfupload 多图片批量上传(附源码下载)

    asp.net的文件上传都是单个文件上传方式,无法执行一次性多张图片批量上传操作,要实现多图片批量上传需要借助于flash,通过flash选取多个图片(文件),然后再通过后端服务进行上传操作. 本次教 ...

  7. 微信录音文件上传到服务器以及amr转化成MP3格式

    微信公众号音频接口开发 根据业务需求,我们可能需要将微信录音保存到服务器,而通过微信上传语音接口上传到微信服务器的语音文件的有效期只有3天,所以需要将文件下载到我们自己的服务器. 上传语音接口 wx. ...

  8. IDEA将项目上传至码云/GitHub托管

    怎么将本地的项目放到码云或者GitHub去托管了?(以码云为例) 一.创建远程项目 第一步:点击创建项目 第二步:填写项目相关信息 第三步:复制远程的项目地址,注意:此处码云官方已经给出上传项目方法, ...

  9. 微信录音文件上传到服务器以及amr转化成MP3格式,linux上转换简单方法

    微信公众号音频接口开发 根据业务需求,我们可能需要将微信录音保存到服务器,而通过微信上传语音接口上传到微信服务器的语音文件的有效期只有3天,所以需要将文件下载到我们自己的服务器. 上传语音接口 wx. ...

随机推荐

  1. PHP 反射应用之一(插件框架)

    http://www.zui88.com/blog/view-205.html 反射,非常有用的一套东西,用来在运行时,分析代码,分析类的属性,方法,参数,实例化类,调用类的方法等等,从而实现框架,实 ...

  2. margin 相关 bug 系列

    原文地址:margin系列之bug巡演 by @doyoe IE6浮动双倍margin bug 这当是IE6最为经典的bug之一. 触发方式 元素被设置浮动 元素在与浮动一致的方向上设置margin值 ...

  3. mybatis+spring事务

    http://www.mybatis.org/spring/zh/transactions.html 第四章 事务 一个使用 MyBatis-Spring 的主要原因是它允许 MyBatis 参与到 ...

  4. awk简单用法

    awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各 ...

  5. Cookie mapping技术

    摘要: RTB竞价中的cookie mapping技术解决DSP的cookie跟ad change的cookie匹配问题. Cookie mapping分为两步:(1)google ad exchan ...

  6. 让程序同时只能运行一个C++ Builder实现(转)

    源:让程序同时只能运行一个 很多人都讨论过这个问题, 这里用Victor串口控件里面现成的共享内存功能来实现. 当程序运行第二次时只是激活第一次运行的窗口, 而不是再运行一个程序. 需要在主程序里实现 ...

  7. 单片机modebus RTU通信实现,采用C语言,可适用于单片机,VC,安卓等(转)

    源:单片机modebus RTU通信实现,采用C语言,可适用于单片机,VC,安卓等 //modebus_rtu.c /***************************************** ...

  8. mybatis--常见的错误

    1.没有在configuration.xml配置对应的sql配置文件 错误: Error updating database. Cause: java.lang.IllegalArgumentExce ...

  9. Oracle行转列的3种方法

    测试表为A3 , 有5个字段:ID1, ID2, ID3, ID4, ID5 测试数据如下: ID1 ID2 ID3 ID4 ID5 1 2 3 4 5 11 22 33 44 55 111 222 ...

  10. IOS开发-UI学习-UISlider(滑动条)的使用

    滑动条即UISlider,是我们常见的软件中设置音量,亮度等的滑条,初始化及基本设置如下: // 新建滑动条 UISlider *slider = [[UISlider alloc]initWithF ...