假设我们将要使用一个立体声 16位 44.1k的音频流,单向(录音或者播放),那么我们就有
- 立体声 = 2通道
- 1个样本 16bits = 2bytes
- 1个帧 代表 所有通道的一个样本。那么我们现在是双通道,所以
- 1帧 = (通道数) * (样本大小bytes) = 2 * 2 = 4bytes
-
为了能支持2 * 44.1k的采样率,系统必须支持如下的速度
- bsp_rate = (通道数) * (1个样本长度) * (采样率) = 1帧 * 采样率 = 2 * 2 * 44.1k = 176400bytes/sec
图我就不挪了 自己看原版吧
现在 alsa每秒都中断。那么我们每秒都需要176400byte数据准备好,才能供上一个 双通道 16 位 44.1k的音频流。
- 如果半秒中断一次,那么每次终端就是 176400 / 2 = 88200 bytes
- 如果100ms中断一次,那么我们就需要 176400 * (0.1 / 1)= 17640 位。
我们可以通过设置period size 来控制pcm中断的产生。
- 如果我们设置一个16位双通道44.1k的音频流 并且每次都有4410帧数据 -》 4 byte * 4410frams = 17640字节 》一次中断会需要17640字节的数据 =》 那么他就是100ms中断一次。
alsa会自己觉得实际的buffer_size 和period_size,根据请求的通道数,和他们其他的一些属性。
下面是一个问题的回答:
帧代表一个单位 1帧 = 通道数 * 样本长度
在你的情况下,1帧占据了 2 通道* 16位 = 4个字节
周期数就是在环形buffer里面的
buffer_size = 周期大小 * 周期数
周期大小(bytes) = 周期大小 * byte每帧
byte每帧 = 通道数 * 每个样本的byte数