come from : https://blog.csdn.net/liuchen_csdn/article/details/52095813
(1) 采样位数 : 也就是codec采样时一个点所占的bit数,通常有8,16,24bit等.
(2) 通道数[channel] : 是mono还是stereo,对应的是1或者是2通道.
(3) 采样率 : codec 每秒采样的点数,如44.1KHZ,就是每秒44100个点.
PCM在采集音频数据时采用frame,periods,channel,及sample bit来设置参数并按照设置的格式来采集.
还得介绍两参数:frames和period:
(1) frames : 是由采样时通道数(channel)和采样位数(sample bit)来共同决定的,和采样频率等其他参数无任何联系,记住是无任何联系,它仅仅是表示采样一次所对应的bit数 . eg
[1] : 1 frame of a Stereo 48khz 16bit PCM stream is 4 bytes.
(对于采样率为48KHZ,采样位数16bit 的立体声的1frame为4字节).
[2] : 1 frame of a 5.1 48khz 16bit PCM stream is 2 bytes.
(对于采样率为5.148KHZ,采样位数16bit的单声道的1rame为2字节).
(2) period : ALSA的官方是这样介绍的 :
A period is the number of frames in between each hardware interrupt.
意思就是硬件的每次中断所对应的frames数为一个period,简称一个周期吧.
exmple : 我们让codec工作在 stereo立体声,16-bits, 44.1KHZ 的采样流中,
[1] ‘stereo’ = 2;
[2] 1 analog sample 是16-bits = 2bytes;
[3]1 frame = (num_channels) * (1 sample in bytes) = (2 channels) * (2 bytes (16 bits) per sample) = 4 bytes (32 bits)
[4] Bps_rate = (num_channels) * (1 sample in bytes) * (analog_rate) = 2 * 2 * 44100 = 176400 Bytes/sec.
如果 ALSA每秒中断一次,那么我们就需要准备176400 bytes的空间.
如果ALSA半秒中断一次,那么我们就需要准备 176400/2 = 88200 bytes个大小的空间. 100ms中断一次的话我们就需要 176400 * 0.1 = 17640 bytes大小空间.
由上面的分析可以看出,我们可以控制PCM中断每次的产生,通过设置period 的大小,
[1] : 如果我们设置16-bit stereo @ 44.1Khz和period_size to 4410 frames =>(对于16-bit stereo @ 44.1Khz, 1 frame 等于 4 bytes 来说- 4410 frames equal 4410*4 = 17640 bytes) => 每100ms一次的中断将产生17640 个字节.
[2] : 相应的buffer_size 应至少为 2 * period_size = 2 * 4410 = 8820frames = 8820 * 4 = 35280bytes.
采集过程中ALSA会将按照我们自己设定的格式将数据按照每period大小存放在循环缓冲区中.
下一篇将详细介绍如何ALSA API编程.
参考链接 : http://www.alsa-project.org/main/index.php/FramesPeriods#