我正在尝试使用 ALSA 和 C 检索当前音频峰值。我希望将此值作为 0.0 和 1.0(或者可能是 0 和 100)之间的标量。在 Windows 上,我使用IAudioMeterInformation,它允许我构建一个非常基本的 VU 表。
编辑:我指的是仅检测扬声器输出,而不是麦克风。
ALSA 没有当前的音频峰值。
在您编写或读取样本时,循环遍历样本以获得最大值。
使用snd_pcm_readi
似乎可以工作,请参见下面的示例:
static float GetLevel (void)
{
float result = 0.0f;
snd_pcm_t* waveform;
// Open and initialize a waveform
if (snd_pcm_open (&waveform, "default",
SND_PCM_STREAM_CAPTURE, 0) != 0)
return 0;
// Set the hardware parameters
if (!snd_pcm_set_params (waveform, SND_PCM_FORMAT_S16_LE,
SND_PCM_ACCESS_RW_INTERLEAVED, 2, 48000, 1, 0))
{
// Read current samples
short buffer[256];
if (snd_pcm_readi (waveform, buffer, 128) == 128)
{
// Compute the maximum peak value
for (int i = 0; i < 256; ++i)
{
// Substitute better algorithm here if needed
float s = buffer[i] / 32768.0f;
if (s < 0) s *= -1;
if (result < s) result = s;
}
}
}
snd_pcm_close (waveform);
return result;
}
然而,我仍然怀疑这是一个很好的解决方案。