CoderMrWu

生活诚可期,爱情价更高!

IOS音频1:开发前的准备

一、简述音乐播放的流程

1、读取MP3文件

2、解析采样率、码率、时长等信息,分离MP3中的音频帧。

3、对分离出来的音频帧解码得到PCM数据

4、对PCM数据进行音效处理(均衡器、混响音等)

5、把PCM数据解码成音频信息

6、 把音频信息交给硬件播放

二、了解CoreAudio的编程接口API架构

《IOS音频1:开发前的准备》

最底层:

  • I/O Kit: 与驱动程序交互的IO套件
  • Audio HAL: 音视频硬件抽象层(音频HAL),它提供与设备无关、与驱动程序无关的接口
  • Core MIDI: 提供了用于处理MIDI流个设备的软件抽象
  • Host Time Services: 主机时间服务,提供计算机时钟的访问。

中间层:

中间层主要用于数据格式转换对磁盘的读写解析流以及使用插件的服务。

  • Audio Converter Services :音频转换器服务是应用程序可以与音频数据格式转换器一起使用。
  • Audio File Services: 音频文件服务支持在基于磁盘的文件中读写音频数据。
  • Audio Unit Services : 音频单元服务和音频处理服务使应用程序可以使用数字信息处理(DSP)插件,例如均衡器和混频器。
  • Audio File Stream Services : 音频文件流服务可以构建可解析流的应用程序,例如用于播放网络音频文件。
  • Core Audio Clock Services: 核心音频时钟服务支持音频和MIDI同步以及时基转换。
  • Audio Format Services : 音频格式服务可以管理应用程序中的音频数据格式。

最高层:

最高层主要是应用层,也就是我们开发人员常常调用的接口层。

  • Audio Queue Services : 可以使用此框架记录、播放、暂停、循环、和同步音频。你可以根据需要来采用编码器来处理压缩的音频格式。
  • AVAduioPlayer: 提供了简单的OC接口,用于播放和循环音频以及实现快退和快进。
  • Extended Audio File Services : 该服务结合了音频文件服务和音频转换服务的功能,它提供了用于读取和写入未压缩和压缩的声音文件的统一界面。
  • OpenAL : 主要用于位置音频的开源的OpenAL标准的核心音频的实现,它建立在系统提供的3D调音台音频单元的顶部。所有应用程序都可以使用它,但它最适合的还是游戏音频的播放。

三、了解Core Audio Frameworks

  • AudioToolbox.framework : 为Core Audio 中的中高级服务提供接口。在IOS中,此框架中的音频会话服务,会为你的应用程序提供一个管理音频服务的上下文。
  • AudioUnit.framework: 通过此框架,你的应用程序可以使用音频插件,包括音频单元和编解码器。
  • AVFoundation.framework : 提供了AVAudioPlayer该类,它用于简单地播放音频,它还提供了AVAudioEngine类用于更复杂的音频处理的类。
  • Core Audio.framework : 提供了跨 Core Audio 使用的数据类型以及用于低级服务的接口。
  • CoreAudioKit.framework : 提供了一个小型API,用于为音频单元创建用户界面,此框架IOS中不能使用。
  • CoreMIDI.framework : 使应用程序可以处理MIDI数据并配置MIDI网络。此框架IOS中不能使用。
  • CoreMIDIServer.framework : 使MIDI驱动程序与OS X MIDI 服务器通信。此框架IOS中不能使用。
  • OpenAL.framework : 提供了与OpenAL(一种开源的位置音频技术)一起使用的接口。

四、总结

1、 如果你是想实现音频的播放,你可以使用AVFoundation 框架中的 AVAduioPlayer类或者AVPlayer类实现本地或者网络音乐的播放,接口简单,不必关心具体的实现。

2、如果音频需要进行流播放,并且需要缓存。那么AudioFileStreamer加AudioQueue能够帮到你,你可以先把音频数据下载到本地,一边下载一边用NSFileHandler等接口读取本地音频文件并交给AudioFileStreamer或者AudioFile解析分离音频帧,分离出来的音频帧可以送给AudioQueue进行解码和播放。

3、如果你正在开发一个专业的音乐播放软件,需要对音频施加音效(均衡器、混响器),那么除了数据的读取和解析以外还需要用到AudioConverter来把音频数据转换成PCM数据,再由AudioUnit+AUGraph来进行音效处理和播放(但目前多数带音效的app都是自己开发音效模块来做PCM数据的处理,这部分功能自行开发在自定义性和扩展性上会比较强一些。PCM数据通过音效器处理完成后就可以使用AudioUnit播放了,当然AudioQueue也支持直接使对PCM数据进行播放。)。

点赞