iOS/swift音频播放(一)


注:文章中代码将以swift形式展示例子

音频基础知识

音频文件PCM

PCM(Pulse Code Modulation,脉冲编码调制)音频数据是未经压缩的音频采样数据裸流,它是由模拟信号经过采样、量化、编码转换成的标准数字音频数据。

PCM是最原始的音频数据完全无损,所以PCM数据虽然音质优秀但是体积庞大,为了解决这一问题,诞生了一系列的音频格式,这些音频格式采用不同的方式对音频数据进行压缩,分为无损压缩(APE、ALAC、FLAC等)和有损压缩(MP3、AAC、WMA等)两种。

首先来了解一些基本属性

  1. sampling : 采样。把模拟音频转成数字音频的过程,就称作采样。采样的过程实际上是将通常的模拟音频信号的电信号转换成二进制码0和1,这些0和1便构成了数字音频文件。要正确理解音频采样可以分为采样的频率和采样的位数。
  2. Sample Rate : 采样频率(单位Hz)。定义了每秒从连续信号中提取并组成离散信号的采样个数,采样频率越高声音的还原就越真实越自然。8kHz(电话)、44.1kHz(CD)、48kHz(DVD)。
  3. Sample Size : 采样位数(单位bit)。采样位数可以理解为采集卡处理声音的解析度。数值越大,解析度就越高,录制和回放的声音就越真实。通常该值为16-bit。
  4. Number of Channels: 通道个数。常见的音频有立体声(stereo)和单声道(mono)两种类型,立体声包含左声道和右声道。另外还有环绕立体声等其它不太常用的类型。
  5. sample: 样本。一个音频样本是单个音频通道的单一数值。
  6. frame: 帧。一个音频帧是时间重合的样本的集合。例如,立体声文件每帧有两个样本,一个用于左声道,一个用于右声道。
  7. packet: 包。一个音频包是一个或多个连续的帧的集合。在线性PCM音频中,音频包始终是单个帧。在压缩格式中,一般是多个帧。在给定的音频格式中,音频包定义了最小且具有意义的一组音频帧的集合。
  8. bit rate: 比特率。也叫码率,声音中的比特率是指将模拟声音信号转换成数字声音信号后,单位时间内的二进制数据量,是间接衡量音频质量的一个指标(比特率越高音质越好)。计算公式:比特率 = 采样率 x 采样位数 x 声道数,单位bps(Bit Per Second)。例如一个48KHz采样率,双声道,16位采样率,它的比特率为 48KHz * 2 * 16bit = 1536kbps(这里的k是1000)。
  9. Sign : 表示样本数据是否是有符号位,比如用一字节表示的样本数据,有符号的话表示范围为-128 ~ 127,无符号是0 ~ 255。
  10. Byte Ordering : 字节序。字节序是little-endian(将低序字节存储在起始地址(低位编址)) 还是big-endian(将高序字节存储在起始地址(高位编址))。通常均为little-endian。
  11. Integer Or Floating Point : 整形或浮点型。大多数格式的PCM样本数据使用整形表示,而在一些对精度要求高的应用方面,使用浮点类型表示PCM样本数据。

MP3 文件结构

MP3是我们比较常见的一种音频格式,文件大体分为三部分:TAG_V2(ID3V2)音频数据TAG_V1(ID3V1)

  1. ID3V2 : 在文件开始的位置,包含了作者,作曲,专辑等信息,长度不固定,扩展了ID3V1 的信息量。
  2. 音频数据 : 一系列的音频数据的帧,在文件的中间位置,个数由文件大小和帧长决定。每个帧的长度可能固定,也可能不固定,由位率bitrate决定。每个帧又分为帧头和数据实体两部分 ,帧头记录了mp3 的位率、采样率、版本等信息,每个帧之间相互独立 。
  3. ID3V1 : 在文件结尾的位置,包含了作者,作曲,专辑等信息,长度为128Byte。

音频播放流程(MP3)

  1. 读取MP3文件。
  2. 解析文件的采样率、码率、时长等信息,并分离MP3中的音频帧。
  3. 对分离出来的音频帧解码得到PCM数据。
  4. 对PCM数据进行音效处理(均衡器、混响器等,非必须)。
  5. 把PCM数据解码成音频信号。
  6. 把音频信号交给硬件播放。
  7. 重复1-6步直到播放完成。

苹果官方对上述的流程进行了封装并提供了不同层次的接口

iOS/swift音频播放(一)

Low-Level Services

I/O Kit: 与硬件驱动交互。

Audio HAL: 音频硬件抽象层,使API调用与实际硬件相分离,保持独立。

Core MIDI: 为MIDI流和设备提供软件抽象工作层。

Host Time Services: 访问电脑硬件时钟。

Mid-Level Services

Audio File Services: 负责音频数据读写,可以完成音频播放流程中的第2步。

Audio File Stream Services: 对音频进行解码,可以用它来读取信息和分离音频帧。可以完成音频播放流程中的第2步。

Audio Converter services: 在各种线性PCM音频格式之间转换。它们还可以在线性PCM和压缩格式之间转换。负责音频数据格式的转换。可以完成音频播放流程中的第3步。

Audio Processing Graph Services: 音效处理模块,可以完成音频播放流程中的第4步。

Audio Unit Services: 播放音频数据,可以完成播放流程中的第5步、第6步。

Core Audio Clock Services: 负责音频时钟同步

High-Level Services

AVAudioPlayer: 可以完成整个音频播放的过程,支持iOS所支持的所有音频的播放,能够实现本地文件和网络流播放,可以完成播放流程中的第1、2、3、5、6步。

Audio Queue Services: 提供录制、播放、暂停、循环、和同步音频它自动采用必要的编解码器处理压缩的音频格式,可以完成播放流程中的第3、5、6步。

Extended Audio File Services: 由Audio File与Audio Converter组合而成,提供压缩及无压缩音频文件的读写能力

OpenAL: 是CoreAudio对OpenAL标准的实现

实现一个音频播放器

AudioFileStream\AudioFile + AudioQueue: 读取音频数据并交给AudioFileStream或者AudioFile解析分离音频帧,分离出来的音频帧可以送给AudioQueue进行解码和播放。

AudioFile + AudioConverter + AudioUnit: 读取音频数据并交给AudioFile解析分离音频帧,分离出来的音频帧交给AudioConverter转换成PCM数据,再把PCM数据交给AudioUnit进行播放。