【问题标题】:How to mix multiple PCM streams using ALSA如何使用 ALSA 混合多个 PCM 流
【发布时间】:2011-10-23 13:32:45
【问题描述】:

我有两个不同的 PCM 样本流。是否有可能以某种方式混合它们并在同一个输出设备上与 ALSA 一起玩?

我读到它可能可以使用混音器,但由于缺乏文档,我发现它很难理解。任何人都可以提供一些有关如何实施(如果确实如此)的更多信息吗?

谢谢!

【问题讨论】:

    标签: playback alsa


    【解决方案1】:

    为此,请检查您的系统是否有 .asoundrc 文件。 如果它不存在,则创建一个,您可以将其放在 /home 文件夹中。 使用以下设置更新它:

    pcm.!default {
                  type plug
                  slave.pcm "dmixer"
    }
    pcm.dmixer  {
                type dmix
            ipc_key 1024
            slave {
              pcm "hw:1,0"
              period_time 0
                  period_size 1024
              buffer_size 4096
              rate 44100
            }
            bindings {
              0 0
              1 1
            }
    }
    ctl.dmixer {
           type hw
           card 0
    }
    

    使用$aplay -l 获取系统上的设备列表。 hw:X,Y 来自您的硬件映射,其中 X 是卡号,而 Y 是设备号。

    现在,打开终端,播放您的第一个 PCM 流: $aplay -f cd pcm_sound1.wav 在其他选项卡中,播放您的第二个 PCM 流: $aplay -f cd -D default pcm_sound2.wav

    它将混合您的两个 PCM 数据流。

    干杯,

    【讨论】:

    • 这个答案很有帮助,但我有点困惑,希望得到更多解释。为什么第二个aplay 命令有-D default,而第一个没有? bindings 部分的含义是什么,ctl.dmixer 是什么意思?是否可以混合两个以上的流,例如如果我同时运行三个aplay 命令?为什么plug 类型的“默认”设备指向dmixer,我们可以将pcm.dmixer 重命名为pcm.!default 并避免间接寻址吗?
    【解决方案2】:

    我不确定这是否值得单独回答。我使用了 HSC 的答案和"ALSA Wiki - The Dmix Howto" 的示例。 Dmix 文档确实有点令人沮丧。

    这是一个适用于我的示例~/.asoundrc。 “绑定”部分是不必要的,但 HOWTO 说它有助于“多通道芯片工作得更快”(不确定我是否关心?)。如果我绑定“0 1 1 0”,那么它会切换右/左声道。如果我绑定“0 1 1 1”,那么我的右耳会出现垃圾……显然ipc_key 是必需参数;我只是选择了一个随机整数。

    # example 1
    pcm.hw3mix {
        type dmix
        ipc_key 1939 # must be unique
        slave {
            pcm "hw:3"
            period_time 0
            period_size 1024 # must be power of 2
            buffer_size 4096
            rate 44100
        }
        bindings {
            0 0
            1 1
        }
    }
    
    pcm.!default hw3mix
    

    最后一行使我的新hw3mix 成为默认设备。

    我将上面的简化为:

    # example 2
    pcm.hw3mix {
        type dmix
        ipc_key 1939 # must be unique
        slave { pcm "hw:3" }
    }
    
    pcm.!default hw3mix
    

    它似乎工作得很好。

    正如上面 ALSA Wiki 链接所建议的,我可以将其进一步简化为:

    # example 3
    pcm.dsp0 {
        type plug
        slave.pcm "dmix"
    }
    
    pcm.!default dsp0
    

    这可以进一步简化为:

    # example 4
    pcm.!default {
        type plug
        slave.pcm "dmix"
    }
    

    甚至:

    # example 5
    pcm.!default plug:dmix
    

    但是,最后三个示例不允许我为 Dmix 插件指定参数。我想创建一个将多个流混合到“hw:3”的设备。我认为这必须指定为 Dmix 的参数,因为它不是默认设备,所以我使用上面的第二个示例。在我实际的~/.asoundrc 中,还有一个名为“hw0mix”的“hw:0,0”块,因此通过更改以下几行中的 cmets,我可以在耳机和耳机之间切换(新创建的)流的输出演讲者:

    #pcm.!default hw0mix
    pcm.!default hw3mix
    

    注意:以上是指“hw:0,0”和“hw:3”之类的设备……我发现如何确保我的各种 USB 声音设备的设备号稳定有点困难,我发现“订购多张相同类型的卡”下的说明here。配置由/etc/modprobe.d/ 中的文件中的一行组成。这就是我如何获得 0 和 3 之类的数字来在重新启动时引用相同的设备。

    【讨论】:

      猜你喜欢
      • 2021-02-13
      • 2016-08-28
      • 2016-06-13
      • 1970-01-01
      • 2020-06-26
      • 2015-11-08
      • 2013-11-17
      • 2012-03-12
      • 1970-01-01
      相关资源
      最近更新 更多