这个星期我完成了一个具有基本录音和回放的功能,一开始也不知道从何入手,也查找了很多相关的资料。与此同时,我也学会了很多关于音频方面的东西,这也对后面的录音配置有一定的帮助。其中参照了《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的使用相关推荐

  1. ios录音文件路径_iOS中录音功能

    应用场景 在即时通讯APP中,例如微信,QQ,等都有语音发送功能,一般都要先将录音录制下来才能发送录音. 音频相关知识介绍: 1. 文件格式(不同的文件格式,可保存不同的编码格式的文件) 1.1 WA ...

  2. iOS 录音功能的实现

    这两天也调了一下ios的录音,原文链接:http://www.iphoneam.com/blog/index.php?title=using-the-iphone-to-record-audio-a- ...

  3. iOS音频播放 (二):AudioSession 转

    原文出处 :http://msching.github.io/blog/2014/07/08/audio-in-ios-2/ 前言 本篇为<iOS音频播放>系列的第二篇. 在实施前一篇中所 ...

  4. php手机网页在线录音ios,iOS 实现录音功能

    参考资料 音频文件相关知识 文件格式 wav: 特点:音质最好的格式,对应PCM编码 适用:多媒体开发,保存音乐和音效素材 mp3: 特点:音质好,压缩比比较高,被大量软件和硬件支持 适用:适合用于比 ...

  5. iphone smtp服务器没有响应,电子邮件卡在iPhone或iPad上的发件箱?如何修复iOS中的未发送邮件 | MOS86...

    您曾经在iOS中发送电子邮件,只能将信息卡在iPhone,iPad或iPod touch的邮件应用发件箱中?你知道这是什么时候发生的,因为在iOS的Mail应用程序的底部,状态栏在iOS中显示1个未发 ...

  6. mui ios中form表单中点击输入框头部导航栏被推起及ios中form表单中同时存在日期选择及输入框时,日历选择页面错乱bug...

    一.ios header导航栏被推起解决方法 1 设置弹出软键盘时自动改变webview的高度 plus.webview.currentWebview().setStyle({ softinputMo ...

  7. iOS中UISearchBar(搜索框)使用总结

    2019独角兽企业重金招聘Python工程师标准>>> iOS中UISearchBar(搜索框)使用总结 初始化:UISearchBar继承于UIView,我们可以像创建View那样 ...

  8. iOS中几种数据持久化方案总结

    概论 所谓的持久化,就是将数据保存到硬盘中,使得在应用程序或机器重启后可以继续访问之前保存的数据.在iOS开发中,有很多数据持久化的方案,接下来我将尝试着介绍一下5种方案: plist文件(属性列表) ...

  9. iOS中关于NSTimer使用知多少

    看到这个标题,你可能会想NSTimer不就是计时器吗,谁不会用,不就是一个能够定时的完成任务的东西吗? 我想说你知道NSTimer会retain你添加调用方法的对象吗?你知道NSTimer是要加到ru ...

最新文章

  1. 剑指offer:数组中只出现一次的数字
  2. not optimal php,php环境配置 配置
  3. python五子棋人人对战_五子棋-人人对战
  4. 昂靠的由来[本博作者爆料]
  5. freemodbus源码/获取地址
  6. 《编程导论(Java)·9.3.1回调·3》回调的实现
  7. ng-admin引用UEditor 插件 Angular-UEditor
  8. CentOS安装l2tpd
  9. Java Maven简明
  10. OBS美颜滤镜插件(BF+)——OBS美颜解决办法
  11. 【异常】The field file exceeds its maximum permitted size of 1048576 bytes.
  12. 图像处理--bicubic(双三次插值)
  13. CAShapeLayer把图片做成圆形效果
  14. linux mysql统计次数_按条件计数 - MySQL统计函数记录_数据库技术_Linux公社-Linux系统门户网站...
  15. 干货 || 详解SMT贴片电感与SMT贴片电容的区别
  16. 大数据技术在我们日常生活中的应用
  17. 用JS实现贪吃蛇小游戏
  18. 【数学建模】基于matlab GUI平行停车模拟仿真【含Matlab源码 1877期】
  19. 用Python做了一个 盯盘机器人,股票价格实时监控,还能邮件通知你!
  20. 经纬度与长度距离转换

热门文章

  1. Excel VBA选择文件、高容错性地打开文件
  2. 呵呵哒学习笔记:《计算机网络》第二章 物理层
  3. 环球科技智库:2017外媒关注的中国十大科技企业
  4. Dictionary
  5. prometheus+grafana+全方位立体监控redis
  6. Android和Windows的区别,平板电脑的Windows系统与Android的区别是什么?
  7. 51PCB科普POFV工艺之生产优势
  8. 死亡爱丽丝服务器维护,《死亡爱丽丝》上线玩家太多 游戏无限期停服维护
  9. 一步HTML5教程学会体系
  10. ArduinoUNO+ESP8266实现MQTT简单发布(不烧录ESP8266)