【问题标题】:Audio mixing with alsa's dmix plugin in c++c++ 中使用 alsa 的 dmix 插件进行音频混合
【发布时间】:2013-08-10 11:20:50
【问题描述】:

我尝试使用 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 文件的速度才会改变。请注意,此时的硬件设置是相同的。为什么设置 stream2 的硬件参数(和播放)会改变 stream1 中的某些内容?

【问题讨论】:

    标签: c++ linux audio alsa


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2010-12-15
      • 2011-10-29
      • 1970-01-01
      • 2012-03-02
      • 2021-02-07
      • 2011-08-20
      • 1970-01-01
      • 1970-01-01
      • 2013-08-09
      相关资源
      最近更新 更多