
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デバイスを設定します。
1人のユーザーにのみこれを実行するには〜/ .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 &