ios中录音功能的实现AudioSession的使用
这个星期我完成了一个具有基本录音和回放的功能,一开始也不知道从何入手,也查找了很多相关的资料。与此同时,我也学会了很多关于音频方面的东西,这也对后面的录音配置有一定的帮助。其中参照了《iPhone开发之音频:
文件和数据类型(一)》,启发比较大。
一、音频格式
iPhone上支持的音频编码格式还是比较多的,而且有很多我是以前听都没有听过的。我就先简单列出来(以下是摘录自《iPhone开发之音频:
文件和数据类型(一)》):
- AAC: AAC其实是“高级音频编码(advanced
audio coding)”的缩写,它是被设计用来取代MP3格式的。你可能会想,它压缩了原始的声音,导致容量占用少但是质量肯定会有所下降。不过这些质量的损失 取决于声音比特率的大小,当比特率合适的时候,这些损失人耳是很难听出来的。事实上,aac比mp3有更好的压缩率,特别是在比特率低于128bit/s 的时候。 - HE-AAC:
HE-AAC是AAC的一个超集,这个“HE”代表的是“High efficiency”。 HE-AAC是专门为低比特率所优化的一种音频编码格式,比如streaming audio就特别适合使用这种编码格式。 - AMR: AMR全称是“Adaptive
Multi-Rate”,它也是另一个专门为“说话(speech)”所优化的编码格式,也是适合低比特率环境下采用。 - ALAC: 它全称是“Apple
Lossless”,这是一种没有任何质量损失的音频编码方式,也就是我们说的无损压缩。在实际使用过程中,它能够压缩40%-60%的原始数据。这种编码格式的解码速度非常快,这对iphone或者ipod这种小型设备来说非常适合。 - iLBC: 这是另一种专门为说话所设计的音频编码格式,它非常适合于IP电话等其它需要流式音频的场合。
- IMA4: 这是一个在16-bit音频文件下按照4:1的压缩比来进行压缩的格式。这是iphone上面一种非常重要的编码格式。
它的中文意思是基于线性脉冲编码调制,用于将模拟声音数据转换成数字声音数据。简而言之,就是意味着无压缩数据。由于数据是非压缩的,它可以非常快的播放,并且当空间不是问题时,这是在iphone上面首选的音频编码方式。 - μ-law and
a-law: 就我所知道的,这种编码是交替的编码模拟数据为数字格式数据,但是在speech优化方面比linear PCM更好。 - MP3: 这种格式是我们都知道也喜欢的,虽然很多年过去了,但MP3到目前为止仍然是一种非常流行的编码格式,它也能被iphone很好地支持。
- LPCM也很早就被定义在DVD播放机
的标准内,为了和CD有所区别,DVD的的采样规格为16bit/48KHz,随着技术的发展,DVD的的采样规格更提升到24bit/96KHz,以达 到更高的播放品质,用96KHz/24bit方式记录的音频信号所能达到的频率上限是96÷2= 48KHz,而它的最大动态范围将可以达到24×6=144dB。从指标上就可以看出:它的声音比CD要好得多。pcm编码的最大的优点就是音质好,最大的缺点就是体数据量大。
而我自己对此的理解是,主流格式iPhone都可以很好地支持了(APE、FLAC暂时忽略)。不过这里值得一提的就是,编码格式与文件格式并不可以混为一谈。为了省事,我就直接选用了caf文件格式,因为caf能包含任何iphone支持的编码格式的数据,在iPhone上面它是推荐的文件格式。
文件格式选好以后,还是有很多的参数可以自己设定的,比特率、采样率和位宽等。当然,选用合适的音频格式还是比较重要,因为不同的格式之间文件大小差异还是比较明显的。就以AAC和LPCM对比为例,采样率同为44100Hz,默认的AAC一分钟的大小约为500kB,但是16bit位宽的LPCM就可以达到5MB。但作为我用于录音的用途,这么大的录音文件,估计录不了多少,用户就会骂我的程序怎么占用这么多空间了。录音务求能够听得出咬字清晰,不需要追求无损的音质。因此,我就选择了AAC格式,同时更小的空间占用也便于上传。
想要调用关于音频方面的API,就要使用到AVAudioSession了。根据参考库的资料,AVAudioSession类参考和AVAudioSessionDelegate协议参考描述了一个管理音频会话的精简接口。如果要使音频会话支持中断,则可以直接使用基于C语言的音频会话服务接口。它是属于C级别的API,录音前,要先将它设为活动。
具体代码
1 AVAudioSession *avSession = [AVAudioSession sharedInstance];
2 [avSession setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];
3 [avSession setActive:YES error:nil];
这是录音前的准备,要实现录音,还需要AVAudioRecorder对象。

1 NSDictionary *settings = [NSDictionary dictionaryWithObjectsAndKeys:
2 [NSNumber numberWithFloat:44100.0], AVSampleRateKey,
3 [NSNumber numberWithInt:kAudioFormatMPEG4AAC], AVFormatIDKey,
4 [NSNumber numberWithInt:1], AVNumberOfChannelsKey,
5 nil];
6
7 AVAudioRecorder *avRecorder = [[AVAudioRecorder alloc] initWithURL:recordUrl
8 settings:settings
9 error:nil];

这就创建了一个编码格式为AAC的AVAudioRecorder对象了,记得要将文件路径转换成NSURL。
1 [avRecorder prepareToRecord];
2 [avRecorder peakPowerForChannel:0];
3 [avRecorder record];
这样就可以开始录音了,停止就调用
1 [avRecorder stop];
当然,还用再次将AVAudioSession的对象设为不活动,所以最好还是调用AVAudioRecorderDelegate的方法-(void)audioRecorderDidFinishRecording:(AVAudioRecorder
*)recorder successfully:(BOOL)flag。
1 [avSession setActive: NO error: nil];
那么,录音的操作就已经完成了。
三、回放录音
本来这个和录音都是大同小异,没什么值得重复说,都要将会话设为活动,实现完成时的delegate方法。但是,我后来发现,这么做有一个问题,回放的声音超级小。起初我以为是音量有问题,就setVolume:1.0。但是依然不起作用,于是上网查了一下,原来要重新将AVAudioSession设一下。
1 [avSession setCategory: AVAudioSessionCategorySoloAmbient error: nil];
其余的也就差不多,不多说了。
ios中录音功能的实现AudioSession的使用的更多相关文章
- iOS 录音功能的实现
这两天也调了一下ios的录音,原文链接:http://www.iphoneam.com/blog/index.php?title=using-the-iphone-to-record-audio-a- ...
- iOS音频播放(二):AudioSession
(本文转自码农人生) 前言 在实施前一篇中所述的7个步骤步之前还必须面对一个麻烦的问题,AudioSession. AudioSession简介 AudioSession这个玩意的主要功能包括以下 ...
- iOS音频播放 (二):AudioSession 转
原文出处 :http://msching.github.io/blog/2014/07/08/audio-in-ios-2/ 前言 本篇为<iOS音频播放>系列的第二篇. 在实施前一篇中所 ...
- iOS中支付宝集成
iOS中支付宝集成 如今各种的App中都使用了三方支付的功能,现在将我在使用支付宝支付集成过程的心得分享一下,希望对大家都能有所帮助 要集成一个支付宝支付过程的环境,大致需要: 1>公司:先与支 ...
- iOS中数据库应用基础
iOS 数据库入门 一.数据库简介 1.什么是数据库? 数据库(Database) 是按照数据结构来组织,存储和管理数据的仓库 数据库可以分为2大种类 关系型数据库(主流) PC端 Oracle My ...
- 正则表达式在iOS中的运用
1.什么是正则表达式 正则表达式,又称正规表示法,是对字符串操作的一种逻辑公式.正则表达式可以检测给定的字符串是否符合我们定义的逻辑,也可以从字符串中获取我们想要的特定部分.它可以迅速地用极简单的方式 ...
- iOS 中的 HotFix 方案总结详解
相信HotFix大家应该都很熟悉了,今天主要对于最近调研的一些方案做一些总结.iOS中的HotFix方案大致可以分为四种: WaxPatch(Alibaba) Dynamic Framework(Ap ...
- iOS中使用正则
一.什么是正则表达式 正则表达式,又称正规表示法,是对字符串操作的一种逻辑公式.正则表达式可以检测给定的字符串是否符合我们定义的逻辑,也可以从字符串中获取我们想要的特定部分.它可以迅速地用极简单的方式 ...
- IOS中div contenteditable=true无法输入
在IOS中<div contenteditable="true"></div>中点击时可以弹出键盘但是无法输入.加一个样式-webkit-user-sele ...
随机推荐
- 2.3.2 InnoDB内存
前面介绍了一些InnoDB的体系架构(http://www.cnblogs.com/tanwt/p/8530987.html) 接下来介绍一下InnoDB 的内存 1.缓冲池 首先我们需要了解的是In ...
- 【BZOJ4571】美味(主席树)
[BZOJ4571]美味(主席树) 题面 Description 一家餐厅有 n 道菜,编号 1...n ,大家对第 i 道菜的评价值为 ai(1≤i≤n).有 m 位顾客,第 i 位顾客的期 望值为 ...
- Bzoj2337:[HNOI2011]XOR和路径
题面 bzoj Sol 设\(f[i]\)表示\(i到n\)的路径权值某一位为\(1\)的期望 枚举每一位,高斯消元即可 不要问我为什么是\(i\ - \ n\)而不可以是\(1\ - \ i\) # ...
- LightOJ1245 Harmonic Number (II)
题意 \(求\Sigma \lfloor \frac{n}{i} \rfloor\) Input starts with an integer T (≤ 1000), denoting the num ...
- LightOJ1282 Leading and Trailing
题面 给定两个数n,k 求n^k的前三位和最后三位 Input Input starts with an integer T (≤ 1000), denoting the number of test ...
- Vue-组件嵌套之——父组件向子组件传值
父组件向子组件传值步骤: 在这里先定义一下,相对本案例来说:App.vue是父组件,Second-module.vue是子组件. 一.首先,值肯定是定义在父组件中的,供所有子组件共享.所以要在父组件的 ...
- Python 终端输出字体颜色
终端的字符颜色是用转义序列控制的,是文本模式下的系统显示功能,和具体的语言无关. 转义序列是以ESC开头,即用\033来完成(ESC的ASCII码用十进制表示是27,用八进制表 ...
- 关系型数据库工作原理-时间复杂度(翻译自Coding-Geek文章)
本文翻译自Coding-Geek文章:< How does a relational database work>. 原文链接:http://coding-geek.com/how-dat ...
- 未来已来,腾讯AI计算网络
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 作者:由鹅厂网事发表在云+社区 "鹅厂网事"由深圳市腾讯计算机系统有限公司技术工程事业群网络平台部运营,我们希望与业界各位志同道合的伙伴交流 ...
- weblogic的使用
1.怎么修改weblogic的端口 创建好域之后,去域的下面找到config.xml文件,在里面加上<listen-port>80</listen-port>即可,访问时不用加 ...