我正在研究使用ALSA API录制音频的一些代码。我配置,然后捕获,然后将捕获的样本写入wav文件。我为S32_LE配置ALSA,签名32位样本。我捕获的数据的每个4字节样本的第1个字节等于0x00,因此看起来我的硬件实际上只捕获24位样本。由于种种原因,这对我来说是合理的。
但是,当我播放wav文件时,声音会失真。音频在那里,我可以说样本大多是正确的,但是捕获非常失真,所以出了点问题。
当我使用与我的代码相同的配置使用arecord时,录制完美,没有失真。所以我知道硬件很好(我的代码很糟糕)。
这是我不明白的。当我比较wav文件,即我的代码生成的wav文件和wav文件arecord生成时,wav文件头完全相同(当然除了块长度值)。所以我的wav文件生成似乎是正确的。
然而,arecord捕获中的样本数据在每个样本字中没有像我的代码捕获那样的0x00。似乎arecord确实是从我的声卡中捕获32位样本。但是当我的代码对32位样本使用相同的配置时,每个样本都有第一个字节0x00。
我错过了一些ALSA配置选项吗?
我的代码使用snd_pcm_hw_params_get_sbits()来检索有效的样本字大小,它确实为样本位数返回32。我已经研究了ALSA实用程序aplay / arecord的源代码,我找不到有关arecord是否以任何方式更改捕获的样本的任何线索。
总之,为什么arecord从硬件中捕获32位样本,只能给我24位样本?
谢谢,
-Andres