我的用例:
我工作在我的家庭办公室,并保持与我的同事经常沟通使用耳机与一些网络会议服务。为了不被某些外界的噪音所干扰或烦扰,我也会在同一台电脑上播放音乐。
我想通过我的高保真音箱播放那音乐。这样,我就可以有一些不干扰我的交流的谨慎的背景音乐。同时,它也帮助我更好地集中精力。
我知道我可以用pavucontrol实现每个应用程序的声音重定向.但是,这个应用程序似乎很麻烦,因为它没有切换默认的输出(稍后只将音乐播放器路由到另一个扬声器)。我必须使用另一个混音器应用程序(在我的例子中,肉桂“声音”小程序),并需要切换两个混频器来设置它。重复所有这些,以防高保真失去连接,或者音乐因某种原因而停止。
因此,由于我通常使用一个特定的应用程序播放音乐,我正在寻找一种方法,以快速路由这个应用程序的声音输出到我的高保真。
发布于 2020-12-05 00:55:59
下面的bash脚本解决了我的场景的问题。我使用勇敢浏览器仅用于音乐播放(而使用其他浏览器的任何其他)。我的高保真是通过蓝牙连接的环绕声接收器:
#!/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脚本可以很容易地根据要查找的说话人名称和应用程序进行调整。
我在面板中添加了此脚本的快捷方式,以便只在需要时单击run。
pactl附带了包pulseaudio-utils。对于pacmd,命令将是类似的。
来源和灵感:
https://unix.stackexchange.com/questions/622987
复制相似问题