ローカルデバイスで再生し、 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デバイスを設定します。

    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"
     }
    
  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 &

おすすめ記事