【问题标题】:Linux sound programming. How to determine a buffer size in frames?Linux 声音编程。如何确定帧中的缓冲区大小?
【发布时间】:2019-05-02 06:57:56
【问题描述】:

我正在试验 ALSA,并在 howto, Section 2 中遇到了以下配置参数:

buffersize的单位取决于函数。有时它是 以字节为单位,有时必须指定帧数。 一帧是所有通道的样本数据向量。对于 16 位 立体数据,一帧长度为四个字节。

/* Set buffer size (in frames). The resulting latency is given by */
/* latency = periodsize * periods / (rate * bytes_per_frame)     */
if (snd_pcm_hw_params_set_buffer_size(pcm_handle, hwparams, (periodsize * periods)>>2) < 0) {
  fprintf(stderr, "Error setting buffersize.\n");
  return(-1);
}

我不明白对于 16 位立体声数据,一帧有长度 四个字节

为什么是四个?它是否遵循通道数:2?我的意思是早些时候他们将其配置如下:

/* Set number of channels */
if (snd_pcm_hw_params_set_channels(pcm_handle, hwparams, 2) < 0) {
  fprintf(stderr, "Error setting channels.\n");
  return(-1);
}

如果我的音响系统包含 4 个输出会怎样?还是6?是不是意味着我必须将其配置为 16 Bit * 4 和 16 Bit * 6?

【问题讨论】:

  • 嗯,每个样本是 16 位(两个字节),你有两个通道(所以乘以 2),这会产生.....四个完整字节的数据。

标签: c linux alsa


【解决方案1】:

为什么是四个?跟随着频道数:2?

是的,按照前面提到的:

一帧是所有通道的样本数据向量。

因此对于立体声 16 位数据,有两个(左右)通道,每个通道 16 位(=2 字节),因此每帧总计 4 个字节。

【讨论】:

  • 谢谢。因此,如果我从麦克风捕获数据,则只有 1 个通道,因此帧大小为 2 个字节。我说的对吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-28
  • 2018-10-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多