同时将音频输出到多个声音设备


10

我希望RasPi可以将音频发送到板载音频输出端口,也可以发送到数字输出卡(I2S Hifiberry Digi)。ALSA应该可以做到这一点。我已经加载了驱动程序,可以分别发送到两个声音设备,但是将它们组合起来是行不通的。有几篇文章解释了如何执行此操作,但是我无法使我的配置正常工作。

播放错误:

Playing WAVE 'sin1000_48khz.wav' : Signed 16 bit Little Endian, Rate 48000 Hz, Stereo
ALSA lib pcm_params.c:2162:(snd1_pcm_hw_refine_slave) Slave PCM not usable
aplay: set_params:1059: Broken configuration for this PCM: no configurations available

“ aplay -l”的输出

**** List of PLAYBACK Hardware Devices ****
card 0: sndrpihifiberry [snd_rpi_hifiberry_digi], device 0: HifiBerry Digi HiFi wm8804-spdif-0 []
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 1: ALSA [bcm2835 ALSA], device 0: bcm2835 ALSA [bcm2835 ALSA]
  Subdevices: 8/8
  Subdevice #0: subdevice #0
  Subdevice #1: subdevice #1
  Subdevice #2: subdevice #2
  Subdevice #3: subdevice #3
  Subdevice #4: subdevice #4
  Subdevice #5: subdevice #5
  Subdevice #6: subdevice #6
  Subdevice #7: subdevice #7
card 1: ALSA [bcm2835 ALSA], device 1: bcm2835 ALSA [bcm2835 IEC958/HDMI]
  Subdevices: 1/1
  Subdevice #0: subdevice #0

“ aplay -L”的输出

null
   Discard all samples (playback) or generate zero samples (capture)
sysdefault:CARD=sndrpihifiberry
    snd_rpi_hifiberry_digi,
    Default Audio Device
sysdefault:CARD=ALSA
    bcm2835 ALSA, bcm2835 ALSA
    Default Audio Device`

/etc/asound.conf的内容

pcm.both {
    type route
    slave.pcm {
        type multi    
        slaves.a.pcm "hw:0,0"
        slaves.b.pcm "hw:1,0"
        slaves.a.channels 2
        slaves.b.channels 2

        bindings.0.slave a
        bindings.0.channel 0    
        bindings.1.slave a
        bindings.1.channel 1

        bindings.2.slave b
        bindings.2.channel 0
        bindings.3.slave b
        bindings.3.channel 1
    }

    ttable.0.0 1
    ttable.1.1 1

    ttable.0.2 1
    ttable.1.3 1
}

ctl.both {
    type hw
    card sndrpihifiberry
    device 0
}

pcm.hifiberry {
    type hw    
    card sndrpihifiberry
    device 0
}

ctl.hifiberry {
    type hw
    card sndrpihifiberry
    device 0
}

pcm.audioout {
    type hw
    card ALSA
    device 0
}

ctl.audioout {
    type hw
    card ALSA
    device 0
}

pcm.!default {
    type plug
    slave {
        pcm both
    }
}

#pcm.!default {    
#    type hw
#    card sndrpihifiberry
#    device 0
#}

ctl.!default {
    type hw
    card sndrpihifiberry
    device 0
}

我认为您应该研究Pulseaudio。但是我在这里可能是错的
-Gerben

3
我研究了pulseaudio。我的经验是它基本上不起作用。
克里斯蒂2014年

经过进一步的研究(以及第二次使用pulseaudio的尝试),我认为问题在于这种功能需要共享访问声卡内存和/或mmap支持。RasPi I2S驱动程序不支持此功能。我不能真的确认这一点,因为没有来自ALSA或PulseAudio的特别有用的调试信息-通常,在尝试使用多个声源之前,一切正常。我不确定是否可以在RasPi内核中修复此问题,但是尝试修复它会花费比我愿意投资的时间更多的时间。
克里斯蒂2014年

我只能建议尝试使pulseaudio工作,因为它能够完全满足您的要求(包括扩展到网络上的其他声卡)。
EarthmeL14年

如上所述,我确实可以使用Pulseaudio。它在每个单独的设备上都能正常工作,然后在您尝试一次创建到多个输出的流时失败。我认为RasPi I2S驱动程序中缺少内存映射是罪魁祸首,但是进一步的调试实质上将涉及学习ALSA和/或Pulseaudio的内部结构,而我没有时间或意愿去做。
克里斯蒂2014年

Answers:


1

这是一个有点哈克但你考虑的tee命令?在Tee 重定向阅读有关StackExchange的更多信息,有关更多示例,请参阅Wiki的文章。我在想,如果您有一个命令可以输出文件名或指向媒体内容的链接ls,并且可以tee用来向您首选的媒体播放器调用命令。这是解决问题的脚本...


#!/bin/bash
MediaPlayer="$1"
MediaOptions1="$2"
MediaOptions2="$3"
InputParcer="ls $4"
${InputParcer} | tee >(${MediaPlayer} ${MediaOptions1}) >(${MediaPlayer} ${MediaOptions2}) || echo 'Exiting baddly'

笔记:

上面的代码可能被硬编码为每个输出分支具有特定的选项,InputParcer如果您打算提交包含多个媒体文件的目录或Web链接,则应编辑变量。但是,如果对1/2进行硬编码或在每次运行中设置,则一次应同时输出两个文件MediaOptions。这有点骇人听闻,您已经被警告过。

...经过测试,然后我可能会在if [ ${#} < 4]; then echo "error"; fi顶部附近折腾;编辑4我感觉需要存在的论点。按原样运行,bash scripted_dule_player 'aplay <common_options>' '<options_output1>' '<options_output2>' '</full/file/path/to/mediafile>'一定要为系统修改希望运行的选项和文件路径;之间的东西<>

使用tee方面的问题是,它在Linux风格之间的移植性不是很好,并且可能导致音频在输出之间无法同步播放的问题。取而代之的是,我建议使用omxplayer -o both来将声音输出到两个单独的设备,但是由于这仅在插入了HDMI和音频的RPi上进行了测试,因此OP所使用的设置与OP所要求的不完全相同alsa

您可能希望浏览有关alsa多声卡多用户配置的不错的博客。也许您有一个错误,使我上面的代码无法解决。只需注意,那里的指南是针对Slaker风格的Linux而非Raspbian的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.