ALSA音频概念介绍

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#

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值