여러 사운드 장치에 동시에 오디오 출력


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
}

펄스 오디오를 살펴 봐야한다고 생각합니다. 그러나 나는 여기에 틀렸다
Gerben

3
펄스 오디오를 살펴 보았습니다. 내 경험은 기본적으로 작동하지 않는다는 것입니다.
Christi

추가 조사 (및 pulseaudio로 두 번째 시도) 후, 문제는 이러한 종류의 기능이 사운드 카드 메모리 및 / 또는 mmap 지원에 대한 공유 액세스가 필요하다는 것입니다. RasPi I2S 드라이버는이를 지원하지 않습니다. ALSA 또는 PulseAudio의 유용한 디버깅 정보가 없기 때문에 실제로 확인할 수는 없습니다. 일반적으로 여러 사운드 소스를 사용하려고 할 때까지 모든 것이 작동합니다. 이것이 RasPi 커널에서 수정 될지 확실하지 않지만, 수정하려고하면 투자 할 시간보다 더 많은 시간이 소요됩니다.
Christi

나는 당신이 원하는 것을 정확하게 할 수 있기 때문에 pulseaudio가 작동하도록 제안 할 수 있습니다 (네트워크의 다른 사운드 카드로 확장 포함).
earthmeLon

위에서 언급했듯이 Pulseaudio가 작동했습니다. 각 개별 장치에서 제대로 작동 한 다음 한 번에 여러 출력으로 스트림을 만들려고하면 실패합니다. RasPi I2S 드라이버의 메모리 매핑 부족이 원인이라고 생각하지만 추가 디버깅에는 본질적으로 ALSA 및 / 또는 Pulseaudio의 내부 구조를 학습하는 것이 필요합니다.
Christi

답변:


1

약간 해 키지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둘 이상의 미디어 파일을 포함하는 디렉토리 또는 웹 링크를 제출하려는 경우 변수를 편집해야합니다. 그러나 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 멀티 사운드 카드 멀티 사용자 구성에 대한 멋진 블로그 도 있습니다 . 어쩌면 당신은 위의 코드 블록을 약점으로 만드는 오류가있을 것입니다. 이 가이드는 Raspbian이 아닌 Slaker 풍미의 Linux를 대상으로 한 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.