로컬 장치에서 재생하고 trx를 통해 스트리밍하기 위해 순수 ALSA로 오디오를 복사합니다.

로컬 장치에서 재생하고 trx를 통해 스트리밍하기 위해 순수 ALSA로 오디오를 복사합니다.

Raspberry Pi를 사용하여 집에서 멀티룸 오디오 설정을 구현하려고 합니다. trx를 통해 다른 장치로 스트리밍하는 동시에 로컬 헤드폰 포트에서 VLC를 재생하려면 어떻게 해야 합니까?

배경:

LAN을 통해 Opus 코덱을 사용하여 대기 시간이 짧은 스트리밍을 허용하는 trx라는 환상적인 패키지를 찾았습니다.http://www.pogo.org.uk/~mark/trx/streaming-desktop-audio.html

다음을 사용하여 trx를 성공적으로 설치했습니다.

sudo modprobe snd-aloop

전송 종료~/.asoundrc

# TX device catches played audio from a player (e.g. VLC)
# point vlc to this device:
#    cvlc --alsa-audio-device="tx" <file_or_stream>
pcm.tx {
    type plug
    slave.pcm {
        type dmix
        ipc_key 2867
        slave {
            pcm "hw:Loopback,0,0"
            rate 48000
            format S16_LE
            channels 2
            period_size 256
            buffer_size 8192
        }
    }
}

# Hubcap ensures 48000Hz sample rate (Opus compatible)
pcm.hubcap {
    type plug
    slave {
        pcm "hw:Loopback,1,0"
        rate 48000
        format S16_LE
    }
}

전송 측:

tx -d hubcap -m 64 -h 239.0.0.99 &

cvlc --alsa-audio-device="tx" {source_file_path_or_url}

수화기:

rx -m 64 -h 239.0.0.99

때로는 버퍼가 부족할 수 있는데, 이는 tx 프로세스의 상태를 -10으로 변경하여 쉽게 해결할 수 있습니다.

renice -n -10 {process_id}

질문:

VLC에서 멀티캐스트 239.0.0.99를 듣고 있는 네트워크의 장치로 오디오를 재생할 수 있을 뿐만 아니라 전송 장치의 헤드폰/라인 출력 소켓에서도 오디오를 재생할 수 있기를 원합니다.

~/.asoundrc에서 플러그, 라우팅 및 멀티플렉싱을 설정하여 로컬 hw:1(헤드폰 소켓) 및 플러그:tx( tx를 통해 오디오를 전달하는 입력).

ALSA 사운드 구성 문서는 끔찍합니다. .asoundrc에 다음을 추가하려고 시도했지만 성공하지 못했습니다.

pcm.headphones_dmix {
        type dmix
        slave {
                pcm "hw:Headphones"
        }
}

pcm.localandtx {
    type plug
    slave {
        format S16_LE
        pcm {
            type multi
            slaves.tx.pcm "tx"
            slaves.tx.channels 2
            slaves.local.pcm "headphones_dmix"
            slaves.local.channels 2
            bindings.0.slave tx
            bindings.0.channel 0
            bindings.1.slave tx
            bindings.1.channel 1
            bindings.2.slave local
            bindings.2.channel 0
            bindings.3.slave local
            bindings.3.channel 1
        }
    }
    route_policy duplicate
    ttable {
        0.0 1
        1.1 1
        0.2 1
        1.3 1
    }
    hint {
        show on
        description "Play both locally and via TX."
    }
}

위와 같이 :

VLC는 로컬 헤드폰으로 즐겁게 재생할 것입니다 --alsa-audio-device="hw:Headphones"

vlc는 rx를 실행하는 장치에서 원활하게 재생됩니다.--alsa-audio-device="tx"

그러나 vlc는 에서 작동하지 않습니다 --alsa-audio-device="localandtx". 둘 다 사용하고 싶습니다. (trx를 통해 오디오를 전송할 때 추가 대기 시간이 있다는 것을 알고 있습니다.)

vlc 오류는 다음과 같습니다.

ALSA lib pcm_direct.c:2031:(snd1_pcm_direct_parse_open_conf) Unique IPC key is not defined
[015a4ac8] alsa audio output error: cannot open ALSA device "localandtx": Invalid argument
[015a4ac8] main audio output error: Audio output failed
[015a4ac8] main audio output error: The audio device "localandtx" could not be used: Invalid argument.
[015a4ac8] main audio output error: module not functional
[71b7a980] main decoder error: failed to create audio output

ALSA 사운드 구성 파일을 디버깅하는 데 유용한 (사운드) 도구가 있습니까?

localandtx의 어떤 .asoundrc 매개변수가 "잘못"인지 어떻게 확인합니까?

PulseAudio를 사용하지 않고 ALSA에서 hw:Headphones 및 tx에 대한 오디오 라우팅을 구현하는 방법은 무엇입니까?

답변1

드디어 Raspberry Pi 멀티룸 오디오 딜레마를 해결했습니다!

해결책은 PulseAudio를 도입하는 것입니다. Raspberry Pi의 ALSA bcm2835 드라이버의 제한으로 인해 ALSA만으로는 이 작업을 수행할 수 없습니다. 내가 잘 이해할 수 없는 이유로 인해 드라이버는 mmap을 사용하여 한 스트림에서 다른 스트림으로 데이터를 복사할 수 없습니다. 이는 mmap이 특별히 활성화되어 있고 mmap 에뮬레이션이 사용되는 경우에도 마찬가지입니다(mmap_emul). 다음을 참조하세요.https://blog.dowhile0.org/2013/04/27/mmap-support-for-raspberry-pi-bcm2835-alsa-driver/.

Raspberry Pi 오디오 스트림 로컬 복사 및 trx를 통한 복사를 위한 완벽한 솔루션:

  1. 전송 최종 설치 패키지:

     sudo su
     sudo apt install alsa-utils opus-tools lame vlc cmake libasound2-dev libortp-dev libopus-dev pulseaudio
     mkdir ~/Installers
     cd ~/Installers
     git clone http://www.pogo.org.uk/~mark/trx.git
     make
     sudo make install
    
  2. 전송 측 - 오디오 그룹에 사용자 추가:

     sudo usermod -a -G audio your_username
    
  3. 전송측 - alsa 루프백 모듈 활성화:

     modprobe snd-aloop
     echo "snd-aloop" | sudo tee -a /etc/modules
    
  4. 송신기 - trx를 지원하도록 ALSA 장치를 설정합니다.

    한 명의 사용자에게만 이 작업을 수행하려면 ~/.asoundrc를 편집해야 하며, 모든 사용자에 대해 이 작업을 수행하려면 /etc/asound.conf를 편집해야 합니다.

     # nano /etc/asound.conf 
    

    또는

     # nano ~/asoundrc:
    

    문서 내용:

     # /etc/asound.conf OR ~/asoundrc:
    
     # tx_dmix ensures audio sent to tx gets resampled properly
     pcm.tx_dmix {
             type dmix
             ipc_key 2867
             ipc_perm 0666 # allow other users
             slave {
                 pcm "hw:Loopback,0,0"
                 rate 48000
                 format S16_LE
                 channels 2
                 period_size 256
                 buffer_size 8192
             }
     }
    
     # tx is the entry point for anything that wants to play down the TX link
     pcm.tx {
             type plug
             slave.pcm "tx_dmix"
             hint.description "Audio input for TX transmission."
     }
    
     # Hubcap is used by TX to resample audio into Opus-friendly sample rate
     pcm.hubcap {
             type plug
             slave {
                     pcm "hw:Loopback,1,0"
                     rate 48000
                     format S16_LE
             }
             hint.description "Internal loopback capture and resampler for TX. Only TX should use."
     }
    
     # Headphones (3.5mm jack) playback
     pcm.headphones_hw {
         type hw
         card Headphones
         sync_ptr_ioctl 1
     }
    
     pcm.headphones {
         type plug
         slave.pcm "headphones_hw"
     }
    
     pcm.!default {
         type plug
         slave.pcm "headphones"
     }
    
  5. 송신기 - PulseAudio 연결 설정

     # nano /etc/pulse/default.pa
    

    또는

     # nano ~/.pulse/default.pa:
    

    문서 내용:

     # PulseAudio config - duplicates audio for local playback and network playback
    
     .include /etc/pulse/default.pa
    
     # Set up Pulse sinks to connect to our ALSA devices we configured in .asoundrc
     load-module module-alsa-sink device="tx" sink_name=tx
     load-module module-alsa-sink device="headphones" sink_name=headphones
    
     # Create stream duplicator
     load-module module-null-sink sink_name=localandtx
     load-module module-loopback source=localandtx.monitor sink=tx
     load-module module-loopback source=localandtx.monitor sink=headphones
     set-default-sink localandtx
    

    이 파일을 생성한 후 펄스를 다시 시작하세요.

     pulseaudio -k
    
  6. 전송 측 - tx 초기화 스크립트 생성:

     nano ~/run_tx.sh
    

    문서 내용

     #!/bin/bash
     # Fires up the TX transmission 
     # Usage:
     #     sudo run_tx.sh [ip] [latency in ms]
     #     sudo run_tx.sh 239.0.0.99 64
    
     # Defaults
     DEFAULT_TX_IP="239.0.0.99"
     DEFAULT_LATENCY_BUFFER_MS="64"
    
     # Resolve from args
     CHOSEN_TX_IP=${$1:-$DEFAULT_TX_IP}
     CHOSEN_LATENCY_BUFFER_MS=${$2:-$DEFAULT_LATENCY_BUFFER_MS}
    
     echo "Launching TX on ${CHOSEN_TX_IP} with ${CHOSEN_LATENCY_BUFFER_MS} ms buffer."
    
     # Start TX, using hubcap ALSA device
     tx -d hubcap -m $(($CHOSEN_LATENCY_BUFFER_MS)) -h $CHOSEN_TX_IP &
    
     # Boost priority of all TX threads (necessary to prevent buffer underruns)
     TX_PIDS=$(ps -L -C tx -o lwp=)
     for TX_PID in TX_PIDS
     do
       sudo renice -10 $(($TX_PID))
     done
    
  7. 송신 측 - 실행 중인 tx 송신기:

     chmod +x ~/run_tx.sh        
     sudo ~/run_tx.sh 
    
  8. Receiver - 패키지 설치(ALSA만 실행, PulseAudio 필요 없음):

     sudo su
     sudo apt install alsa-utils opus-tools lame vlc cmake libasound2-dev libortp-dev libopus-dev
     mkdir ~/Installers
     cd ~/Installers
     git clone http://www.pogo.org.uk/~mark/trx.git
     make
     sudo make install
    
  9. 수신자 - rx init 스크립트 생성:

     nano ~/run_rx.sh
    

    문서 내용

     #!/bin/bash
     # Fires up the RX Reception side
     # Usage:
     #     sudo run_rx.sh [ip] [latency in ms]
     #     sudo run_rx.sh 239.0.0.99 64
    
     # Defaults
     DEFAULT_RX_IP="239.0.0.99"
     DEFAULT_LATENCY_BUFFER_MS="64"
    
     # Resolve from args
     CHOSEN_RX_IP=${$1:-$DEFAULT_RX_IP}
     CHOSEN_LATENCY_BUFFER_MS=${$2:-$DEFAULT_LATENCY_BUFFER_MS}
    
     echo "Launching RX receiver, listening on ${CHOSEN_RX_IP} with ${CHOSEN_LATENCY_BUFFER_MS} ms buffer."
    
     # Start RX, using default ALSA device
     rx -m $(($CHOSEN_LATENCY_BUFFER_MS)) -h $CHOSEN_RX_IP &
    
     # Boost priority of all RX threads (necessary to prevent buffer underruns)
     RX_PIDS=$(ps -L -C rx -o lwp=)
     for RX_PID in RX_PIDS
     do
       sudo renice -10 $(($RX_PID))
     done
    
  10. 수신기 - rx 수신기 실행:

    chmod +x ~/run_rx.sh        
    sudo ~/run_rx.sh 
    
  11. tx 측의 일부 콘텐츠를 PulseAudio 기본 수신기(localandtx)로 재생합니다. 수신 장치의 기본 오디오 출력을 통해 수신 측에서 재생됩니다.

rx에서 재생할 다른 오디오 장치를 지정하려면 라인 -d "alsa_device_name"에 옵션을 추가하십시오 rx -m $(($CHOSEN_LATENCY_BUFFER_MS)) -h $CHOSEN_RX_IP &.rx -m $(($CHOSEN_LATENCY_BUFFER_MS)) -h $CHOSEN_RX_IP -d Headphones &

관련 정보