alsa frame period period_size buffer_size 等解释

英文原版

FramesPeriods

一个frame就等于一个要被播放的声音样本。与通道数和样本长度无关。
例子:

  • 1帧立体声48khz 16位的pcm数据长度为4bytes
  • 1帧5.1正道48k 16位pcm流的大小为12bytes

一个period就是每两次硬件中断之间的帧数。poll()会每个周期return一次。
buffer是一个环形buffer,大小一般来说比一个period size大,一般设做 2 * period size,但是一些硬件可以支持到8个周期大小的buffer,也可以设为非整数倍的period的大小。

现在如果我们的硬件设置为48khz,2周期,每个周期1024个帧,那么buffer size 就是2048个帧。硬件每处理一个buffer会中断2次,alsa会一直让buffer保持一个满的状态,每当第一个周期的样本播放完成,第二个周期的数据就会被播放,同时第三个周期的数据就会进入到第一个周期数据的位置。

例子

另一个例子:
假设我们将要使用一个立体声 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数

后面不愿意翻了 大概意思有了。

翻译的不太好。如果有错误,请告知,谢谢。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值