录音
0. 应用场景
语音聊天:大多数应用在即时通讯APP中, 语音发送
语音备忘录:录一段音频, 来记录某件事情
1. 录音步骤
-
导入AVFoundation框架
// OC #import <AVFoundation/AVFoundation.h> // swift import AVFoundation
-
使用类AVAudioRecorder进行录音
- objc
// 1. 创建录音文件存放路径 NSString *path = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"text.caf"]; NSURL *url = [NSURL URLWithString:path]; // 2. 设置录音附加设置项(#import <AVFoundation/AVAudioSettings.h>),固定配置 NSMutableDictionary *recordSettings = [[NSMutableDictionary alloc] init]; // 设置编码格式 [recordSettings setValue :[NSNumber numberWithInt:kAudioFormatLinearPCM] forKey: AVFormatIDKey]; // 采样率 [recordSettings setValue :[NSNumber numberWithFloat:11025.0] forKey: AVSampleRateKey];//44100.0 // 通道数 [recordSettings setValue :[NSNumber numberWithInt:2] forKey: AVNumberOfChannelsKey]; //音频质量,采样质量 [recordSettings setValue:[NSNumber numberWithInt:AVAudioQualityMin] forKey:AVEncoderAudioQualityKey]; // 3. 根据路径以及设置项, 创建录音对象 _audioRecorder = [[AVAudioRecorder alloc] initWithURL:url settings:recordSettings error:nil]; // 4. 准备录音 [self.audioRecorder prepareToRecord]; // 5. 开始录音 [self.audioRecorder record]; // 6. 停止录音 [self.audioRecorder stop];
- swift
var record: AVAudioRecorder? override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { // 开始录音 // 1.1 创建路径 let path = (NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true).first)! let filePath = path + "/test.caf" print(filePath) let fileURL = NSURL(string: filePath)! // 1.2 创建一个录音配置字典 // 录音参数设置(不需要掌握, 一些固定的配置) // 这个配置, 可以保证, 音质比较好的情况下, 大小也适中 let configDic: [String: AnyObject] = [ // 编码格式 AVFormatIDKey: NSNumber(int: Int32(kAudioFormatLinearPCM)), // 采样率 AVSampleRateKey: NSNumber(float: 11025.0), // 通道数 AVNumberOfChannelsKey: NSNumber(int: 2), // 录音质量 AVEncoderAudioQualityKey: NSNumber(int: Int32(AVAudioQuality.Min.rawValue)) ] do { // 1.3 创建录音对象 record = try AVAudioRecorder(URL: fileURL, settings: configDic) }catch { print(error) return } // 2. 准备录音 record?.prepareToRecord() // 3. 开始录音 record?.record() // 从设置的时间点,开始录音 // record?.recordAtTime((record?.deviceCurrentTime)! + 2) // 从后面的某个时间点, 录音多久 // record?.recordAtTime((record?.deviceCurrentTime)! + 2, forDuration: 3) // 从当前时刻开始录音, 录音多久 // record?.recordForDuration(2) } override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) { // 获取当前的录音时间(长度, 录音多久了) let duration = record?.currentTime ?? 0 if duration < 2 { print("录音时间太短, 清重新录音") // 删除当前录音的文件 // 删除文件, 一定要保证, 录音停止 record?.stop() record?.deleteRecording() return } print("录音时间刚刚好,可以保存") record?.stop() // 可参考本文第5点通过lame转音频文件转码 }
-
概念补充
1. 编码概念:编码是信息从一种形式转换为另一种形式的过程
2. 编码格式
> AAC: AAC其实是“高级音频编码(advanced audio coding)”的缩写,它是被设计用来取代MP3格式的。
> HE-AAC: HE-AAC是AAC的一个超集,这个“HE”代表的是“High efficiency”。 HE-AAC是专门为低比特率所优化的一种音频编码格式
> AMR: AMR全称是“Adaptive Multi-Rate”,它也是另一个专门为“说话(speech)”所优化的编码格式,也是适合低比特率环境下采用
> ALAC: 它全称是“Apple Lossless”,这是一种没有任何质量损失的音频编码方式,也就是我们说的无损压缩
> IMA4: 这是一个在16-bit音频文件下按照4:1的压缩比来进行压缩的格式。
> MP3
> LPCM : 即线性脉冲编码调制,是一种非压缩音频数字化技术,是一种未压缩的原音重现;数字模式下, 音频的初始信号是PCM> 参考资料地址 http://baike.baidu.com/link?url=z36Nw7UihAEnCC6BjCygft9rBpLr29Ru0of_9Blpl0aR6qzI1B9iWTD5h3uimPVix2SuuQYo7GVYOIsaaP2Eyq 3. 文件格式(不同的文件格式, 可保存不同的编码格式) > WAV : 特点: 音质最好的格式, 对应PCM编码 适用: 多媒体开发、保存音乐和音效素材。 > MP3 : 特点: 音质好,压缩比比较高,被大量软件和硬件支持 适用: 适合用于比较高要求的音乐欣赏。 > caf : 特点: 适用于几乎iOS中所有的编码格式
开发经验
1. caf 文件格式, 因为某些编码设置, 文件有可能会很大, 而且caf, 格式并不是很通用, 所以在开发过程中, 一般会进行压缩转码, MP3;-
使用lame静态库转码
-
iOS 通过(lame)将录制音频转换成Mp3
1. LAME是一个开源的MP3音频压缩软件。LAME是一个递归缩写,来自LAME Ain't an MP3 Encoder(LAME不是MP3编码器)。它自1998年以来由一个开源社区开发,目前是公认有损品质MP3中压缩效果最好的编码器。
2. 步骤:
第一步: 下载lame的最新版本并解压:http://sourceforge.net/projects/lame/files/lame/3.99/
第二步:生成静态库
1. 下载build的脚本:https://github.com/kewlbear/lame-ios-build
2. 提升权限:命令行中输入sudo -s
3. 修改脚本权限(所有人有可执行权限):chmod a+x 脚本名称
4. 执行脚本:./脚本名称
5. 注意: 如果最终没有生成静态库:
1. 先检查XCode应用名称是否是XCode(后面不要加2, 3 之类的东西)
2. commod + , 把命令行工具选中
第三步:导入静态库到工程, 开始使用,最好封装成一个分类,提供一个转码的方法
-
iOS 通过(lame)将录制音频转换成Mp3