Alsa Lib 硬件参数设置
Alsa Lib Hardware Parameters setting
我正在尝试使用 alsa 库在我的 linux (debian) 嵌入式设备上录制声音。我的嵌入式硬件是这个 [1],根据其数据表第 33 页 [2],
Analog audio signals are featured by the on-SOM TLV320AIC3106 audio codec.
以及此德州仪器音频编解码器的数据表 [3],
Supports Rates From 8 kHz to 96 kHz
我使用 alsa lib 的示例应用程序代码,对于初始工作我没有更改代码。在示例代码中,采样率设置为 44100Hz。我成功地录制了声音并播放了。目前,我认为,我可以根据数据表使用 alsa-lib 以 8000Hz 的采样率录制声音。我将采样率设置为 8000Hz,但在 alsa 配置时,它变为 16000Hz。
我将采样率设置为 8000Hz;
snd_pcm_hw_params_set_rate_near(handle, params, &(record_params->rate), &dir);
snd_pcm_hw_params_set_channels(handle, params, record_params->channel);
rc = snd_pcm_hw_params(handle, params);
但是调用这个方法后;
snd_pcm_hw_params_get_period_time(params, &(record_params->rate), &dir);
变为16000,以上之间没有其他方法调用。是我的设置有误还是编解码器不支持 8kHz?
更新:当我设置rate为16000时,它变成了8000。我真的更困惑了。
[1] = http://www.variscite.com/products/system-on-module-som/cortex-a9/dart-mx6-cpu-freescale-imx6
[2] = http://www.variscite.com/images/stories/DataSheets/DART-MX6/DART-MX6_v1_2_datasheet_v2_1.pdf
周期时间和费率是两个不同的东西。
PCM 的周期基本上是在设备中断之间传输的帧数。这样做是因为逐帧向设备传输数据效率极低。
ALSA 库允许以微秒(使用 snd_pcm_get_period_time
)或帧计数(使用 snd_pcm_get_period_size
)指定周期大小的设置。
如果您要计算为读取或写入 PCM 分配的缓冲区大小,使用 snd_pcm_get_period_size
(returns 中的帧数会更直观period) 然后调用 snd_pcm_frames_to_bytes
,它将 PCM 的帧数转换为字节数。
我正在尝试使用 alsa 库在我的 linux (debian) 嵌入式设备上录制声音。我的嵌入式硬件是这个 [1],根据其数据表第 33 页 [2],
Analog audio signals are featured by the on-SOM TLV320AIC3106 audio codec.
以及此德州仪器音频编解码器的数据表 [3],
Supports Rates From 8 kHz to 96 kHz
我使用 alsa lib 的示例应用程序代码,对于初始工作我没有更改代码。在示例代码中,采样率设置为 44100Hz。我成功地录制了声音并播放了。目前,我认为,我可以根据数据表使用 alsa-lib 以 8000Hz 的采样率录制声音。我将采样率设置为 8000Hz,但在 alsa 配置时,它变为 16000Hz。 我将采样率设置为 8000Hz;
snd_pcm_hw_params_set_rate_near(handle, params, &(record_params->rate), &dir);
snd_pcm_hw_params_set_channels(handle, params, record_params->channel);
rc = snd_pcm_hw_params(handle, params);
但是调用这个方法后;
snd_pcm_hw_params_get_period_time(params, &(record_params->rate), &dir);
变为16000,以上之间没有其他方法调用。是我的设置有误还是编解码器不支持 8kHz?
更新:当我设置rate为16000时,它变成了8000。我真的更困惑了。
[1] = http://www.variscite.com/products/system-on-module-som/cortex-a9/dart-mx6-cpu-freescale-imx6
[2] = http://www.variscite.com/images/stories/DataSheets/DART-MX6/DART-MX6_v1_2_datasheet_v2_1.pdf
周期时间和费率是两个不同的东西。
PCM 的周期基本上是在设备中断之间传输的帧数。这样做是因为逐帧向设备传输数据效率极低。
ALSA 库允许以微秒(使用 snd_pcm_get_period_time
)或帧计数(使用 snd_pcm_get_period_size
)指定周期大小的设置。
如果您要计算为读取或写入 PCM 分配的缓冲区大小,使用 snd_pcm_get_period_size
(returns 中的帧数会更直观period) 然后调用 snd_pcm_frames_to_bytes
,它将 PCM 的帧数转换为字节数。