音频播放
来源:
码农人生博客
音频基础
音频文件的生成过程是将声音信息采样、量化和编码产生的数字信号的过程
对声音进行采样、量化过程被称为脉冲编码调制(Pulse Code Modulation),简称PCM。PCM数据是最原始的音频数据完全无损
音频播放流程:
1.读取MP3文件
2.解析采样率、码率、时长等信息,分离MP3中的音频帧
3.对分离出来的音频帧解码得到PCM数据
4.对PCM数据进行音效处理(均衡器、混响器等,非必须)
5.把PCM数据解码成音频信号
6.把音频信号交给硬件播放
7.重复1-6步直到播放完成
在iOS系统中apple对上述的流程进行了封装并提供了不同层次的接口(图片引自apple官方文档)。
CoreAudio的接口层次
下面对其中的中高层接口进行功能说明:
- Audio File Services:读写音频数据,可以完成播放流程中的第2步;
- Audio File Stream Services:对音频进行解码,可以完成播放流程中的第2步;
- Audio Converter services:音频数据转换,可以完成播放流程中的第3步;
- Audio Processing Graph Services:音效处理模块,可以完成播放流程中的第4步;
- Audio Unit Services:播放音频数据:可以完成播放流程中的第5步、第6步;
- Extended Audio File Services:Audio File Services和Audio Converter services的结合体;
- AVAudioPlayer/AVPlayer(AVFoundation):高级接口,可以完成整个音频播放的过程(包括本地文件和网络流播放,第4步除外);
- Audio Queue Services:高级接口,可以进行录音和播放,可以完成播放流程中的第3、5、6步;
- OpenAL:用于游戏音频播放,暂不讨论
可以看到apple提供的接口类型非常丰富,可以满足各种类别类需求:
如果你只是想实现音频的播放,没有其他需求AVFoundation会很好的满足你的需求。它的接口使用简单、不用关心其中的细节;
如果你的app需要对音频进行流播放并且同时存储,那么AudioFileStreamer加AudioQueue能够帮到你,你可以先把音频数据下载到本地,一边下载一边用NSFileHandler等接口读取本地音频文件并交给AudioFileStreamer或者AudioFile解析分离音频帧,分离出来的音频帧可以送给AudioQueue进行解码和播放。如果是本地文件直接读取文件解析即可。(这两个都是比较直接的做法,这类需求也可以用AVFoundation+本地server的方式实现,AVAudioPlayer会把请求发送给本地server,由本地server转发出去,获取数据后在本地server中存储并转送给AVAudioPlayer。另一个比较trick的做法是先把音频下载到文件中,在下载到一定量的数据后把文件路径给AVAudioPlayer播放,当然这种做法在音频seek后就回有问题了。);
- 如果你正在开发一个专业的音乐播放软件,需要对音频施加音效(均衡器、混响器),那么除了数据的读取和解析以外还需要用到AudioConverter来把音频数据转换成PCM数据,再由AudioUnit+AUGraph来进行音效处理和播放(但目前多数带音效的app都是自己开发音效模块来做PCM数据的处理,这部分功能自行开发在自定义性和扩展性上会比较强一些。PCM数据通过音效器处理完成后就可以使用AudioUnit播放了,当然AudioQueue也支持直接使对PCM数据进行播放。)。下图描述的就是使用AudioFile + AudioConverter + AudioUnit进行音频播放的流程(图片引自官方文档)。