问题描述
我需要切换当前正在播放的音频流的pulseaudio服务器。
Pulseaudio服务器设置为IP 192.168.1.105
$>cat /etc/pulse/default.pa
...
load-module module-esound-protocol-tcp auth-anonymous=1
load-module module-native-protocol-tcp auth-anonymous=1
load-module module-zeroconf-publish
...
在源端,VLC媒体播放器正在播放歌曲。
我在源端创建了一个带有pulseaudio的新隧道接收器。
pacmd load-module module-tunnel-sink server=192.168.1.105
pacmd set-default-sink 1
但在播放音频时,服务器无法立即更改。只有在停止播放器并重放后,才可以。
从”gnome-volume-control”或“gnome-control-center声音”立即应用输出设备的切换。
如何在播放声音文件时立即从命令行应用切换输出接收器?
最佳解决方法
PulseAudio pacmd
无法切换默认接收器,同时有一个主动播放流到接收器输入。但是有一种方法可以实现这一目标。
从命令行更改默认接收器
首先,我们需要确定要切换的接收器的索引号。这可以通过调用:
pacmd list-sinks
根据我们的系统,这将为您提供或多或少冗长的接收器和属性列表,目前可访问:
>>> 2 sink(s) available.
* index: 0
name: <alsa_output.pci-0000_01_00.1.hdmi-stereo-extra1>
driver: <module-alsa-card.c>
:
:
index: 1
name: <alsa_output.pci-0000_00_14.2.analog-stereo>
driver: <module-alsa-card.c>
这里给出的index
或name
是我们通过命令行来解决接收器所需的。当前的默认接收器标有星号(此处为0
)。
为了能够从命令行切换默认接收器,我们可能需要通过编辑/etc/pulse/default.pa
中的对应线来禁用流目标设备恢复:
load-module module-stream-restore restore_device=false
要将默认输出接收器更改为接收1
,我们将运行
pacmd set-default-sink 1
通过打开“声音设置”菜单可以显示成功。
将流移动到另一个接收器
当我们将活动输入流播放到给定接收器时更改默认接收器无效。这应该通过将此输入移动到另一个接收器来完成。
pacmd list-sink-inputs
将告诉我们输入流的索引
>>> 1 sink input(s) available.
index: 5
driver: <protocol-native.c>
我们现在知道我们要通过调用将输入流5
移动到接收器1
pacmd move-sink-input 5 1
如果我们愿意,可以回到0
。这将立即完成,无需停止播放。
播放时更改默认接收器
当然,我们可以将这两个命令组合起来在播放期间立即切换默认接收器,例如同
pacmd set-default-sink 1 & pacmd move-sink-input 5 1
这种方法的缺点是每次我们停止并重启音乐播放器时输入流索引都会改变。所以我们总是要在使用命令行切换之前找出当前的流索引。
次佳解决方法
我写了一个简单的脚本来自动移动所有sink-inputs。
用法:./movesinks.sh <sink number>
#!/bin/bash
echo "Setting default sink to: $1";
pacmd set-default-sink $1
pacmd list-sink-inputs | grep index | while read line
do
echo "Moving input: ";
echo $line | cut -f2 -d' ';
echo "to sink: $1";
pacmd move-sink-input `echo $line | cut -f2 -d' '` $1
done
第三种解决方法
#!/usr/bin/env bash
case "${1:-}" in
(""|list)
pacmd list-sinks |
grep -E 'index:|name:'
;;
([0-9]*)
echo switching default
pacmd set-default-sink $1 ||
echo failed
echo switching applications
pacmd list-sink-inputs |
awk '/index:/{print $2}' |
xargs -r -I{} pacmd move-sink-input {} $1 ||
echo failed
;;
(*)
echo "Usage: $0 [|list|<sink name to switch to>]"
;;
esac
我的运行时副本是on github,它还包括自动切换kmix
的主通道
第四种方法
从命令行有一个ruby脚本(我最初分叉并重写了部分)that lets you change default sinks, volume, and mute status。
第五种方法
我拼凑了几个不同的地方的东西,并提出这个脚本,一旦配对就设置蓝牙JAMBOX。你的MAC当然会有所不同。由于我通过Clementine应用程序控制JAMBOX音量,因此在我的情况下130%音量最佳。你可能想要改变它,以及rhythmbox.png(这是我在计算机上找到的唯一的扬声器图片)。错误检查是基本的,但工作非常可靠。为了方便起见,我把它放在桌面发射器上,用于华硕上网本。
#!/bin/bash
# setjambox connection setup
# Find the particulars of your environment with 'pactl list sinks'
# This script uses the sink name instead of the index number
# You also need libnotify-bin to run this script
# Enter the bluetooth MAC address of your device here
MAC=00:21:3C:9F:19:AD
# Make ready
# Convert device address per pulseaudio standards
DEV=$(echo $MAC|tr ':' '_')
TITLE="JAMBOX $MAC"
CONNECTED="Audio connection updated."
PROBLEM="Unable to update settings."
JBLOGO=/usr/share/icons/hicolor/48x48/apps/rhythmbox.png
# And go
pactl list short sink-inputs | while read stream; do
streamId=$(echo $stream | cut '-d ' -f1)
pactl move-sink-input "$streamId" bluez_sink.$DEV
done
pactl set-default-sink bluez_sink.$DEV
pactl set-card-profile bluez_card.$DEV a2dp
pactl set-sink-volume bluez_sink.$DEV 130%
if [ $? -eq 0 ]
then
notify-send -i $JBLOGO -t 3000 "$TITLE" "$CONNECTED"
else
notify-send -i gtk-dialog-warning -t 3000 "$TITLE" "$PROBLEM"
fi