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

一,开始录音

NSLog(@"开始录音");

[self startRecord];

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

二,停止录音

[self endRecord];

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

三,转码成MP3

 - (void)transformCAFToMP3 {
mp3FilePath = [NSURL URLWithString:[NSTemporaryDirectory() stringByAppendingString:@"myselfRecord.mp3"]]; @try {
int read, write; FILE *pcm = fopen([[recordUrl absoluteString] cStringUsingEncoding:], "rb"); //source 被转换的音频文件位置
fseek(pcm, *, SEEK_CUR); //skip file header
FILE *mp3 = fopen([[mp3FilePath absoluteString] cStringUsingEncoding:], "wb"); //output 输出生成的Mp3文件位置 const int PCM_SIZE = ;
const int MP3_SIZE = ;
short int pcm_buffer[PCM_SIZE*];
unsigned char mp3_buffer[MP3_SIZE]; lame_t lame = lame_init();
lame_set_in_samplerate(lame, 11025.0);
lame_set_VBR(lame, vbr_default);
lame_init_params(lame); do {
read = (int)fread(pcm_buffer, *sizeof(short int), PCM_SIZE, pcm);
if (read == )
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, , mp3); } while (read != ); lame_close(lame);
fclose(mp3);
fclose(pcm);
}
@catch (NSException *exception) {
NSLog(@"%@",[exception description]);
}
@finally {
NSLog(@"MP3生成成功");
base64Str = [self mp3ToBASE64];
}
}

四,上传需要转码BASE64

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

备注:其中可以直接生成的.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中var_dump() 打印出一个对象的时候,信息怎么看?

    php 的一个依赖注入容器, 说白了,就是用php 的反射类,来在运行的时候动态的分析类具有的函数,以及动态分析函数的参数, 从而实例化类,并执行类的方法. 另外,php 中的 typehint 还是 ...

  2. Mysql临时表的用法 - 51CTO.COM

    body{ font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI& ...

  3. (中等) HDU 2295 , DLX+重复覆盖+二分。

    Description N cities of the Java Kingdom need to be covered by radars for being in a state of war. S ...

  4. iOS校验身份证是否合法

    //身份证号验证 1900+/2000+的年份日期的正则表达式经过修改,目前貌似是对的,如果哪位朋友发现错误希望能够给与提示 //返回yes位表示格式正确,否则为错误 -(BOOL)IDCardAut ...

  5. Keil MDK从未有过的详细使用讲解

    转自博客:http://blog.csdn.net/zhzht19861011/article/details/5846510 这博主关于MDK 的使用的文章,写的得TM的好  TM的实用! 真心收藏 ...

  6. box2d中的物理世界

    box2d中的物理世界,即b2World类就是一个包含了各种物体(body,物理体,或者叫刚体),固定附着物(fixture,形状与物理体的绑定物)以及各种约束体(比如关节),并使其在当中完成各种交互 ...

  7. IOS开发-UI学习-NSMutableAttributedString(带属性的字符串)的使用

    带属性的字符串: NSString *aa = @"hellochinaIloveYou!"; NSMutableAttributedString *mas = [[NSMutab ...

  8. MySQL密码过期策略

    如果要设置密码永不过期的全局策略,可以这样:(注意这是默认值,配置文件中可以不声明) [mysqld] default_password_lifetime=0 禁用密码过期: ALTER USER ' ...

  9. Swing 窗口的最小化到系统图标与还原

    2014年2月26日 13:01:47 一个上午的功夫,终于折腾好了. 上午主要是卡在监听事件的参数问题.当时脑子不好使,忘记事件是自己构造的,傻傻的测试了半天,如何传递窗口的参数 等中午解决的时候, ...

  10. 分30条依次解析xml并插入数据库成功

    package xxx; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import or ...