在 c++ 中使用 alsa 的 dmix 插件进行音频混合

Audio mixing with alsa's dmix plugin in c++

本文关键字:插件 音频 混合 dmix c++ alsa      更新时间:2023-10-16

我试图使用alsa同时播放两个wav文件。请注意,wav文件具有不同的采样率。这是可能的,并且音频流被混合并发送到音频芯片。(我是在嵌入式linux设备上开发的。)但有一个流的播放速度是正常播放速度的几倍。所以我想重新采样有问题。

我有一个默认的设备,在/etc/asound.conf中启用了dmix插件,并将采样率设置为44100Hz。但据我所知,ALSA在内部将所有流重新采样到48khz,并在再次向下采样到我想要的输出速率之前将其混合,在我的情况下为44.1khz。

这是正确的吗?

当使用alsa-lib播放音频文件时,我需要为特定的wav文件设置所有参数吗?

例如:8000hz单声道16位

  • 将snd_pcm_hw_params_set_rate()设置为8000hz
  • snd_pcm_hw_params_set_format转换为16位LE/BE/有符号/无符号
  • 单声道的snd_pcm_hw_params_set_channels

这会更改设备的硬件设置还是仅更改此特定音频流的硬件设置?

如有任何澄清,不胜感激。

编辑:

我可能误解了以下内容:[ALSA]

当启用软件混合时,ALSA会强制将所有内容重新采样到相同的频率(支持时默认为48000)。dmix使用了较差的重采样算法,这会产生明显的音质损失

所以需要明确的是,如果我将dmix设备的asound.conf中的速率更改为44100,那么所有的东西都应该自动重新采样到44100并混合?

因此,我的两个混合音频文件中有一个速度不正确的原因可能是使用alsa-lib的流设置不正确造成的?

因为如果我一次播放一个wav文件,两个流似乎都是正确的。只有当第一个正在播放,同时我在流中混合另一个时,第一个wav文件的速度才会改变。请注意,此时硬件设置是相同的。为什么设置流2的硬件参数(和播放)会改变流1中的某些内容?

ALSA没有固定的48 kHz重采样。

dmix设备使用固定的采样率和格式,但所有使用它的设备通常都使用plug插件来实现自动转换。

使用alsa-lib时,必须设置所有对您重要的参数;对于任何未明确设置的参数,alsa-lib都会选择一个有点随机的值。

不同的流可以使用不同的参数。