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를 통한 복사를 위한 완벽한 솔루션:
전송 최종 설치 패키지:
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
전송 측 - 오디오 그룹에 사용자 추가:
sudo usermod -a -G audio your_username
전송측 - alsa 루프백 모듈 활성화:
modprobe snd-aloop echo "snd-aloop" | sudo tee -a /etc/modules
송신기 - 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" }
송신기 - 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
전송 측 - 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
송신 측 - 실행 중인 tx 송신기:
chmod +x ~/run_tx.sh sudo ~/run_tx.sh
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
수신자 - 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
수신기 - rx 수신기 실행:
chmod +x ~/run_rx.sh sudo ~/run_rx.sh
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 &