コマンドラインで特定のアプリケーションの音楽を特定のサウンド出力に送信する

コマンドラインで特定のアプリケーションの音楽を特定のサウンド出力に送信する

マイユースケース:

私はホームオフィスで働いており、ヘッドフォンといくつかのWeb会議サービスを使用して、同僚との継続的なコミュニケーションを維持しています。外部の騒音に気を散らしたり、迷惑にならないように、同じコンピュータで音楽を再生します。

ハイファイスピーカーで音楽を再生したい。これにより、コミュニケーションを妨げない慎重な背景音楽を再生できます。さらに、集中力も向上するのに役立ちます。

しかし、このアプリはpavucontrolデフォルトの出力を切り替えないため、問題があるようです(後で音楽プレーヤーのみが別のスピーカーにルーティング)。他のミキサーアプリ(私の場合はCinnamon "Sound"アプレット)を使用し、2つのミキサーを切り替えてすべてを設定する必要があります。何らかの理由でHi-Fi接続が切断されたり音楽が途切れたりする場合は、この操作をすべて繰り返してください。

だから私は主に特定のアプリを使って音楽を再生するので、方法を見つけました。早く路線ただこのアプリは私のハイファイでサウンドを出力します。

ベストアンサー1

次のbashスクリプトは私のシナリオの問題を解決しました。私は音楽を再生するためにのみBraveブラウザを使用します(他のコンテンツには別のブラウザを使用します)。私のハイファイは、Bluetooth経由で接続されたサラウンドレシーバーです。

#!/bin/bash
    
# Collect all sinks
sinkList=$(pactl list sinks | tr '\n' '\r' | perl -pe 's/Sink #([0-9]+).+?device\.description = "([^\r]+)"\r.+?(?=Sink #|$)/\1:"\2",/g' | tr '\r' '\n')
IFS="," read -a sinksArray <<< "$sinkList"

# Is our Hi-fi sink available? → Use for loop with indexes to handle spaces in names
for ((i = 0; i < ${#sinksArray[@]}; i++)); do
  sink="${sinksArray[$i]}"
  #echo "sink found: $sink"

  # Search for this output device's name
  [[ "$sink" =~ "Philips HTB" ]] && hifiSinkIndex=$(echo $sink | cut -d':' -f1)
done

if [[ $hifiSinkIndex ]]; then
  echo "Hi-fi sink has index $hifiSinkIndex"

  # Collect all sound streams
  musicSourcesList=$(pactl list sink-inputs | tr '\n' '\r' | perl -pe 's/Sink Input #([0-9]+).+?application\.process\.binary = "([^\r]+)"\r.+?(?=Sink Input #|$)/\1:\2\r/g' | tr '\r' '\n')

  for soundSource in $musicSourcesList; do
    binary=$(echo $soundSource | cut -d':' -f2);
    index=$(echo $soundSource | cut -d':' -f1);
    #echo "index: $index, binary: $binary";

    # Brave browser is our music player, so we only care about that
    if [[ "$binary" == "brave" ]]; then
      echo "moving Brave output to $hifiSinkIndex"
      pactl move-sink-input $index $hifiSinkIndex
    fi
  done
else
  echo "Hi-fi sink was not found"
fi

お探しのプレゼンター名とアプリケーションを見つけるためにスクリプトを簡単に調整できます。

必要なときにのみ実行をクリックできるように、このスクリプトのショートカットをパネルに追加しました。

pactl包装が付属していますpulseaudio-utils。を使用すると、pacmdコマンドは似ています。

ソースとインスピレーション:

  • 元のクエリpacmdこの回答寄稿者: phil294
  • forループは空白のある配列値を繰り返します。この回答ダンパイギ

おすすめ記事