基本概念
- 采样率: 每秒采集的采样点次数。如480000HZ, 就是我们常见的48KHZ
- 采样点(Sample):每一个采样点代表一个时间点的声音幅度值。对于立体声,每个采样点包含了两个声道(左声道,右声道)的数据。
- 帧:一帧就是一个时刻采集的数据,如果音频是立体声则会产生2个采样点,如果是更复杂的比如5.1,则会产生更多的采样点。例如PCM数据是48KHZ,16bit的, 立体声, 则一秒的PCM数据有48KHZ帧。每一帧会有两个采样点, 每个采样点用16bit存储着。
- 声道:对于立体声有两个声道,左声道和右声道。
比如,我们有个PCM数据,是 48KHZ, 立体声, 16bit 。
那么则代表, 这段数据每一秒,将产生48K帧, 每一帧,包含两个声道的数据,每一个声道的数据,用16bit表示。
一帧数据, 是16 X 2 = 32 bit = 4字节。
音频数据每一帧存储规则
上述已经说明了,一帧数据,就是一个采样点上的数据。接下来我们还是以立体声为例子,讲讲一帧的音频数据是怎么存储的。
这一帧数据代表多长时间的音频呢?
其实很简单, 1S/48000 = 21微秒。
所以一帧大约能播放21微秒的时长,非常非常短。
音频帧与帧的存储规则
音频帧与帧的存储规则就相当简单了,就是按照顺序来即可。 只不过每帧的内部,是按照声道来排布的。也就是L1, R1, L2, R2, L3, R3...这种规则来存储。
因为音频的数据存在这种规则,所以在硬件播放这些数据的时候,只需要根据固定的地址间隔来取内存,就很轻松的将左右声道分来来取了。 两者可以做到同时播放。
硬件对于帧数据的播放流程
DMA技术
讲到音频播放,底层是离不开DMA技术的。我们首先讲讲这个DMA技术,这套技术不止用于音频播放。
DMA全称为 Direct Memory Access, 直接内存访问。 是一种硬件技术,允许外部设备,如音视频硬件, 磁盘控制器等,绕过CPU,直接与计算机运行时内存(RAM)进行数据读写。它的核心是解放CPU,避免CPU被频繁的数据搬运占用任务。
Android的音视频播放高度依赖DMA技术,其核心价值在于减轻CPU负载,降低延迟,提升效能。
DMA技术除了用在音视频播放外,还广泛使用于:
- 显卡从内存读取纹理数据
- 硬盘读写大文件
- 网络设备收发数据包
- 摄像头传输图像数据
音频怎么写进去的
Android中音频的写入,依赖DMA技术, AudioTrack会将最终已经处理完的PCM数据,
- 通过调用AudioFlinger的代码来配置内存缓冲区地址,
- 音频外设寄存器地址也配置到DMA中
- 开启循环模式,支持扬声器连续播放。
- 其中,DMA取数据的时候,在用户缓冲区存在双缓冲,来避免播放中断。
用户开发播放器处理的是哪一块
我们开发播放器的时候肯定不会用到这么深的技术,在Android的体系内,最深只要达到AudioFlinger即可。
音频开发中,主要掌握的就是上方环节中,对音频数据的采集,处理, 编码,传输等环节。这些内容几乎涵盖行业内应用层99%的需求。