通过命令行将音乐从特定应用程序发送到特定声音输出

通过命令行将音乐从特定应用程序发送到特定声音输出

我的用例:

我在家庭办公室工作,并使用耳机和一些网络会议服务与同事保持持续沟通。为了不被某些外界噪音分散注意力或烦恼,我还从同一台计算机播放音乐。

我希望通过我的高保真扬声器播放音乐。这样,我就可以播放一些不干扰我交流的谨慎背景音乐。此外,它还能帮助我更好地集中注意力。

我知道我可以使用pavucontrol.然而,这个应用程序似乎有问题,因为它不会切换默认输出(稍后仅将音乐播放器路由到另一个扬声器)。我必须使用另一个混音器应用程序(在我的例子中是 Cinnamon“声音”小程序),并且需要在两个混音器之间切换才能将其全部设置好。并重复所有这些,以防高保真音响失去连接或音乐因某种原因停止。

因此,由于我通常使用一个特定的应用程序来播放音乐,因此我一直在寻找一种方法迅速地路线仅有的这个应用程序的声音输出到我的高保真音响。

答案1

以下 bash 脚本解决了我的场景的问题。我仅使用 Brave 浏览器来播放音乐(同时使用其他浏览器来播放其他内容)。我的高保真音响是通过蓝牙连接的环绕接收器:

#!/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,命令将类似。

来源和灵感:

相关内容