PCM
脉冲编码调制(Pulse Code Modulation)。最常见的低级别数字音频编码形式。以有规律的间隔对音频信号取样(称为采样率),然后根据位深对特定范围内的离散值进行量化。例如,对于 16 位 PCM,样本值是介于 -32768 到 +32767 之间的整数值。在ALSA API中把它用作“音频”的简写。
channel
单个音频信息流,通常与一个录音位置或播放位置相对应。单声道可以用mono表示,双声道可以用stereo表示。
sample
代表某个时间点上一个声道的音频值的数字。一个sample是一个单一值,描述单个通道上单个时间点上音频信号的幅度。
sample_rate or frame_rate
每秒帧数。“帧率”这一用法更为准确,但业内习惯使用“采样率”来表示帧率。frame rate频与sample rate相同。也就是说,假设立体声音频的采样率为44100Hz。那么每个通道每秒将具有44,100个sample。但是每秒还将有44,100帧,因此两个通道的总密度将为每秒88,200个sample。常见的sample_rate有:8KHz/16KHz/32KHz/44.1KHz/48KHz.
frame
某个时间点上的样本集,每一个frame都由若干个channel的一个sample组成。比如单声道在每个frame里就包含1个sample,而立体声在每个frame里面包含2个samples。
当我们谈论使用数字音频时,我们经常要谈论代表单个时间点上所有channels的数据。这是sample的集合,每个channel一个,通常称为“frame”。当我们以frame为单位谈论时间的流逝时,它大致相当于人们以sample为单位进行测量的时间,但更为准确;更重要的是,当我们谈论某个时间点代表所有channels所需的数据量时,这是唯一有意义的单位。几乎每个ALSA Audio API函数都使用frame作为其数据量的度量单位。
gain
大于或等于 1.0 的乘法因数,应用于音频信号以提高信号电平。与“attenuation”相反。
Hz
采样率或帧率的单位。
latency
信号通过系统时的延迟时间。
capture
从外部接受数据,比如外部输入MIC的数据,就需要用capture来接受数据。
playback
将数据传递到外界,以便可以听到它。比如向喇叭播放声音,就需要playback。
xrun
音频接口开始运行后,它就会持续的playback或者capture数据,直到被告之停止。它将生成供计算机使用的数据,或者将数据从计算机发送到外界。由于各种原因,您的程序可能会跟不上它。所以我们使用xrun来代表如下两种情况:
overrun
未能在一定的时间内接受提供的数据而导致的听得到的短时脉冲波干扰。通常playback设备有可能遇到这种情况,底层需要新数据进来,而上层却没有及时送过来,所以这时底层只能使用在硬件缓存里面的旧音频数据,这时就会听见重复的声音,好像卡住一样。与“underrun”相反。
underrun
未能在一定的时间内提供所需数据而导致的听得到的短时脉冲波干扰。通常是capture设置有可能遇到这种情况,上层还没有及时处理完底层提供的当前的数据,底层就又发新数据过来了,所以这时底层只能覆盖新数据到迎接缓存里,这时就会听到声音突变。与“overrun”相反。
panning
将一个信号移至立体声或多声道音场中的相应位置。
ramp
逐渐提高或降低特定音频参数(如音量或某种音效的强度)的级别。音量斜坡一般用于暂停和继续播放音乐,以免出现听得到的生硬过渡。
downmixing
减少声道的数量,例如从立体声到单声道或从5.1到立体声。缩混通过减少声道、混合声道或更高级的信号处理技术来实现。如果简单地混合声道而不进行衰减或加以限制,则可能会出现溢出或削波的情况。与“upmixing”相反。
upmixing
增加声道的数量,例如从单声道到立体声或从立体声到环绕声。扩混通过复制、平移或更高级的信号处理技术来实现。与“downmixing”相反。
mute
暂时强制将音量降为 0;独立于通常使用的音量控件。
volume
响度,音频信号的主观强度。
interleaved
一种数据布局安排,其中将在同一时间播放的每个通道的样本依次相继跟随。与“non-interleaved”相反
比如我们有Channel0的两个数据分别是0x11,0x22;channel1的两个数据分别是0x33,0x44,那么实际存储方式就是:
0x11 0x33 0x22 0x44
non-interleaved
一种数据布局,其中单个通道的样本依次相继,另一个通道的样本位于另一个缓冲区或该缓冲区的另一部分。与“interleaved”相反。
比如我们有Channel0的两个数据分别是0x11,0x22;channel1的两个数据分别是0x33,0x44,那么实际存储方式就是:
0x11 0x22 0x33 0x44
ALSA
The Advanced Linux Sound Architecture。Linux 的音频框架,对其他系统也有影响。要了解通用定义,请参阅 ALSA。在 Android 中,ALSA 指的是内核音频框架和驱动程序,而不是用户模式 API。另请参阅“tinyalsa”。
period
period是每个硬件中断之间的frame数。 poll()将在每一个period返回一次。 period定义了更新状态的频率,通常通过中断的调用来进行。在某些硬件上,irq是根据计时器控制的。 在这种情况下,period定义了调用irq的计时器频率。
period_size
period_size定义frame个数。该术语与OSS上的“fragment size”一个意思。 在大多数的声音硬件上,ring-buffer(环形缓冲区)被分为几个部分,并且在每个块边界上发出一个irq。 period_size定义此块的大小。值得注意的是period_size是没有单位的。
period_count
代表有多少个periods.period_count = number_of_periods
period_bytes
1 | period_bytes = period_size * bytes_per_frame |
period_time
period_size的另一种表示方法。注意peroid_time与sample无关,不论是16bits还是32bits的sample都没有关系,它只与sample_rate有关。1
2
3period_time = period_size x time_per_frame
= period_size x time_per_sample
= period_size / sample_rate
buffer_size
buffer一般都是ring-buffer(环形缓冲区)。buffer大小必须始终大于一个period大小。 通常这是2period_size,但是某些硬件可以为每个buffer执行8个period_size。buffer大小也可能不是period_size的整数倍。
举个例子,如果已设置为peroid_count=2,peroid_size=1024frames,则buffer_size=21024=2048frames。硬件将在每个buffer中中断2次。ALSA将努力保持buffer尽可能满。如果播放了第一段的1024frames,将发生一次中断,并将第三段1024frames转移到第一段1024frames所占用的空间,同时播放第二段1024frames。buffer_size = number_of_periods * period_size
buffer_time
1 | time_of_one_buffer = buffer_size_in_frames x time_for_one_frame |