录音、播放、转码

  • 录音
  • 播放
  • 转成MP3
  • base64转码
  • caf转码MP3
  • 调用
  • 分享心得:

录音

#import <AVFoundation/AVFoundation.h>
#import "lame.h" // 转成MP3需要该文件@interface RecorderTestController ()<AVAudioRecorderDelegate,AVAudioPlayerDelegate>
{AVAudioPlayer * player;// 音频播放
}
@property (nonatomic,strong) AVAudioRecorder * audioRecorder; // 录音工具

开始录音,下面这部分代码可以直接复制使用

-(void)startRecordcase{//删除上次生成的文件,保留最新文件NSFileManager *fileManager = [NSFileManager defaultManager];//默认就是wav格式,是无损的if ([fileManager fileExistsAtPath:[NSTemporaryDirectory() stringByAppendingPathComponent:@"testRecorder.WAV"]]) {[fileManager removeItemAtPath:[NSTemporaryDirectory() stringByAppendingPathComponent:@"testRecorder.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:8000] forKey:AVSampleRateKey];//录音通道数 1 或 2 ,要转换成mp3格式必须为双通道[recordSetting setValue:[NSNumber numberWithInt:2] forKey:AVNumberOfChannelsKey];//线性采样位数 8、16、24、32[recordSetting setValue:[NSNumber numberWithInt:16] forKey:AVLinearPCMBitDepthKey];//录音的质量[recordSetting setValue:[NSNumber numberWithInt:AVAudioQualityMax] forKey:AVEncoderAudioQualityKey];[recordSetting setValue:[NSNumber numberWithBool:NO] forKey:AVLinearPCMIsNonInterleaved]; //交叉的// 设置录制音频采用高位优先的记录格式[recordSetting setValue:[NSNumber numberWithBool:NO] forKey:AVLinearPCMIsBigEndianKey];// 设置采样信号采用浮点数[recordSetting setValue:[NSNumber numberWithBool:NO] forKey:AVLinearPCMIsFloatKey];//存储录音文件NSURL * recordUrl = [NSURL URLWithString:[NSTemporaryDirectory()stringByAppendingPathComponent:@"testRecorder.WAV"]];//初始化录音对象NSError * error;self.audioRecorder = [[AVAudioRecorder alloc] initWithURL:recordUrl settings:recordSetting error:&error];if (error) {NSLog(@"%@",error.description);return;}self.audioRecorder.delegate = self;//开启音量检测self.audioRecorder.meteringEnabled = YES;AVAudioSession * audioSession = [AVAudioSession sharedInstance];//得到音频会话单例对象//如果不是正在录音if (![self.audioRecorder isRecording]) {[audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];//设置类别,表示该应用同时支持播放和录音[audioSession setActive:YES error:nil];//激活当前应用的音频会话,此时会阻断后台音乐的播放.[self.audioRecorder prepareToRecord];//准备录音[self.audioRecorder record];//开始录音}
}
//结束录音
- (void)endRecord
{[self.audioRecorder stop];  //录音停止
}
//录音结束后代理
-(void)audioRecorderDidFinishRecording:(AVAudioRecorder *)recorder successfully:(BOOL)flag{[[AVAudioSession sharedInstance] setActive:NO error:nil];//一定要在录音停止以后再关闭音频会话管理(否则会报错),此时会延续后台音乐播放if (!flag) return;
}

播放

- (void)playWav{//获取录音数据
NSData * wavData = [NSData dataWithContentsOfFile:[NSTemporaryDirectory() stringByAppendingPathComponent:@"testRecorder.WAV"]];
NSError * error;player = [[AVAudioPlayer alloc]initWithData:wavData error:&error];player.delegate = self;if (error) {NSLog(@"语音播放失败,%@",error);return;}//播放器的声音会自动切到receiver,所以听起来特别小,如果需要从speaker出声,需要自己设置。
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:&error];
// 单独设置音乐的音量(默认1.0,可设置范围为0.0至1.0,两个极端为静音、系统音量):
player.volume = 1.0;
//    修改左右声道的平衡(默认0.0,可设置范围为-1.0至1.0,两个极端分别为只有左声道、只有右声道):
player.pan = -1;
//    设置播放速度(默认1.0,可设置范围为0.5至2.0,两个极端分别为一半速度、两倍速度):
player.rate = 2.0;
//    设置循环播放(默认1,若设置值大于0,则为相应的循环次数,设置为-1可以实现无限循环):
player.numberOfLoops = 0;
//调用prepareToPlay方法,这样可以提前获取需要的硬件支持,并加载音频到缓冲区。在调用play方法时,减少开始播放的延迟。
[player prepareToPlay];
//    开始播放音乐:
[player play];
}//播放完成代理
- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag{if (flag) {//调用pause或stop来暂停播放,这里的stop方法的效果也只是暂停播放,不同之处是stop会撤销prepareToPlay方法所做的准备。[player stop];player = nil;}
}

转成MP3

-(void)convertToMp3SouceFilePathName:(NSString *)sourcePath isDeleteSourchFile:(BOOL)isDelete
{// 输入路径NSString *inPath = sourcePath;// 判断输入路径是否存在NSFileManager *fm = [NSFileManager defaultManager];if (![fm fileExistsAtPath:sourcePath]) {NSLog(@"文件不存在");}// 输出路径NSString *outPath = [[sourcePath stringByDeletingPathExtension] stringByAppendingString:@".MP3"];@try {int read, write;FILE *pcm = fopen([inPath cStringUsingEncoding:1], "rb");  //source 被转换的音频文件位置fseek(pcm, 4*1024, SEEK_CUR);                                   //skip file headerFILE *mp3 = fopen([outPath 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, 8000);// 采样率lame_set_num_channels(lame, 2);//通道lame_set_quality(lame, 0);//质量 质量范围0~9。0最好。9最差lame_set_VBR(lame, vbr_default);lame_set_brate(lame, 8); //设置压缩比例 默认压缩比例是11lame_init_params(lame);do {size_t size = (size_t)(2 * sizeof(short int));read = (int)fread(pcm_buffer, size, PCM_SIZE, pcm);if (read == 0)write = lame_encode_flush(lame, mp3_buffer, MP3_SIZE);elsewrite = 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 {NSLog(@"MP3生成成功:");if (isDelete) {NSError *error;[fm removeItemAtPath:sourcePath error:&error];if (error == nil) {NSLog(@"删除源文件成功");}}return outPath;}
}

base64转码

-(NSString *)recordmp3ToBASE64; // mp3格式 base64转码
{NSString *strdatamp3 = [self convertToMp3SouceFilePathName:[NSTemporaryDirectory() stringByAppendingPathComponent:@"testRecorder.WAV"] isDeleteSourchFile:YES]; // 调用转码方法 转成MP3NSData *mp3Data = [[NSData dataWithContentsOfFile:strdatamp3] base64EncodedDataWithOptions:0];NSString * encodedRecordStr = [[NSString alloc]initWithData:mp3Data encoding:NSUTF8StringEncoding];return encodedRecordStr;
}

caf转码MP3

以上就是整个录音的过程,其中录音文件的名称以及后缀是可以更改的,后缀可以更改为caf格式。

testRecorder.WAV可以更改为testRecorder.caf。更改之后就是caf转MP3,可以根据项目要求进行格式更换。

调用

完成以上工作之后,就可以在使用的地方直接调用了。必须完成以上代码!!!
比如开始录音:

[self startRecordcase];

结束录音:

[self endRecord];

播放录音:

[self playWav];

通过接口上传录音:

[self recordmp3ToBASE64];

分享心得:

以上就是我在项目上使用的方法。其实在第一次写转码的时候出现了转码之后的文件全部是杂音的问题。找了很长时间才找到原因。
第一:

[recordSetting setValue:[NSNumber numberWithBool:NO] forKey:AVLinearPCMIsNonInterleaved]; //交叉的录制
// 设置录制音频采用高位优先的记录格式
[recordSetting setValue:[NSNumber numberWithBool:NO] forKey:AVLinearPCMIsBigEndianKey];
// 设置采样信号采用浮点数
[recordSetting setValue:[NSNumber numberWithBool:NO] forKey:AVLinearPCMIsFloatKey];

以上三种参数必须设置为No,转码之后的MP3文件就都是杂音。

第二:转成MP3需要lame文件。所以必须下载lame文件。这个在网上是都可以搜到。下载下来的lame文件包含了两个,如下图所示:

iOS录音、播放、WAV以及caf转成MP3上传后台相关推荐

  1. js文件上传精准校验文件类型,防止直接.mp4改成.mp3上传

    一个完成音乐上传的需求,按照常理都是在onChange的时候拿file的type来判断类型对不对,这样是存在很大风险的,如果用户直接修改了文件名的后缀,比如.mp4直接改成.mp3,在不支持的播放器中 ...

  2. iOS录音播放简例-AVFoundation

    iOS录音播放简例-AVFoundation 本例简单介绍一个demo,录制一段声音,再播放它,用的是AVFoundation框架. 一.添加AVFoundation框架,在.m文件中引入 #impo ...

  3. IOS开发基础之使用AFNetworking框架实现文件上传get和post请求

    IOS开发基础之使用AFNetworking框架实现文件上传get和post请求 AFNetworking框架 请自行从github官网clone.命令为 git clone xxx.xxx是项目的地 ...

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

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

  5. Android自定义相机不存储照片,转换成Bitmap上传

    在最近的开发中,遇到一个需求,使用相机拍照,但是不能存储到本地,并上传到服务器,这边用到的服务器接受上传的是base64的,需要将图片转换成base64上传.接下来我们开始整. CameraPrevi ...

  6. phpcms附件实现Flash上传换成H5上传

    将Flash上传换成H5上传和其他富文本编辑器的版本吗? 由于谷歌浏览器宣布不再支持flash上传的方式,而phpcms默认的正是flash上传,官方不在维护,只能有我们自己二开了. 网上h5上传的插 ...

  7. 录音播放系统(实现pcm转码mp3,wav)

    本文介绍了基于waveX低级音频API采集音频,然后播放的技术,也支持实时的播放.对于将录音和播放分开的做法原因是为了保存pcm文件(未经压缩过的音频文件), 然后转码wav和mp3格式. PCM(P ...

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

    文章目录 一.Recorder H5录音库的特性 (1)浏览器支持 (2)功能支持 二.使用预览截图 (1)移动端H5 (2)IOS Hybrid App (3)Android Hybrid App ...

  9. ios 开发证书导出p12文件_开发者在上传企业签名的应用到后,做到如下几点

    苹果ipa签名根据经验,很多开发者在违背了上述条款后,导致企业账号被封,从而造成了不小的损失.所以,开发者在上传企业签名的应用到后,做到如下几点: 1;不要将企业签名后的应用发布到"应用广场 ...

  10. PPTPDF文件转换成图片上传OSS

    PPTPDFIMAGE 先把文件上传至本地,再去读取文件转变上传. <dependency><groupId>org.apache.pdfbox</groupId> ...

最新文章

  1. Eclipse插件使用links目录的用法
  2. LSMW批处理使用方法(01)_总述及界面说明
  3. linux tcmalloc,内存管理TCMalloc 安装和使用
  4. oracle通过sid远程登录,oracle怎么捕获用户登录信息,如SID,IP地址等
  5. C# 之浅拷贝与深拷贝问题拙见(一)
  6. 人工智能?.NetCore一样胜任!
  7. mysql delete temporary denied_这些错误是什么意思?djang中的mysql
  8. oracle的exp和imp,oracle exp和imp
  9. Linux是命令行吗,你真的了解Linux命令吗?
  10. homebrew安装
  11. kafka 集群_Kafka集群搭建
  12. js对象定义的几种方法
  13. 逃出你的肖申克(五):看不见的牢笼(上)
  14. python re模块的(...),group(),groups()
  15. 常用正则表达式(英文单词、数字、中文 、URL 、电话、身份证、输入内容必须以逗号隔开等)
  16. 直播软件开发公司来告诉你什么是互动直播
  17. 网络安全自学笔记04 - 路由器技术
  18. 最佳机器学习公共数据集
  19. 用opencv和vc++6.0开发的五子棋游戏软件
  20. 【Proteus仿真】【51单片机】智能雨刷器设计

热门文章

  1. Linux 系统-----vim命令详解
  2. 项目:智能语音对话机器人
  3. 【深度学习之美笔记】人工“碳”索意犹尽,智能“硅”来未可知(入门系列之二)
  4. HTML5期末大作业:一款基于HTML+CSS+JavaScript +Bootstrap 响应式的花店/花卉装饰/花卉网上商店/婚礼花/花束商店购物网站
  5. 模拟电路和数字电路区别
  6. Fortify代码扫描工具
  7. iptables 性能 测试
  8. UEFI引导修复教程
  9. ubuntu下好用的TCP/UDP调试工具
  10. aws s3 上传文件 html,javascript 上传文件到 aws s3存储桶