Answers:
为了从命令行更改默认音频输出设备,可以使用pacmd
Pulse Audio命令行实用程序。
我发现今天需要做类似的事情,想在耳机和扬声器之间切换,两者都插入了独立的声卡。这是我为此编写的shell脚本:
#!/usr/bin/env bash
sinks=($(pacmd list-sinks | grep index | \
awk '{ if ($1 == "*") print "1",$3; else print "0",$2 }'))
inputs=($(pacmd list-sink-inputs | grep index | awk '{print $2}'))
[[ ${sinks[0]} = 0 ]] && swap=${sinks[1]} || swap=${sinks[3]}
pacmd set-default-sink $swap &> /dev/null
for i in ${inputs[*]}; do pacmd move-sink-input $i $swap &> /dev/null; done
笔记:
pacmd
实用程序列出的前两个音频输出设备之间交换。如果您有两个以上的音频设备,并且想要交换到另一个音频设备,则需要用一些条件替换第7行的逻辑。这个问题已经很老了,但我的回答可能仍然对GNOME 2用户有用。我将PulseAudio Mixer Applet用于此处描述的确切问题。您可以直接在面板菜单中更改输入和输出设备。这是我发现的最方便的方法。
当然,使用Applet切换设备也可以正常工作。但是编写脚本的有趣之处在于它非常快。我把我的例如放在键盘快捷键alt + s上。因此,当我想从耳机切换到扬声器时,只需按alt + s。
无论如何。安德鲁说:
如果您有两个以上的音频设备,并且想要交换到另一个音频设备,则需要用一些条件替换第7行的逻辑。
那就是我所做的。我共享它,以防万一有人遇到麻烦:
#!/usr/bin/env bash
#sinks=($(pacmd list-sinks | grep index | \
# awk '{ if ($1 == "*") print "1",$3; else print "0",$2 }'))
sinks=($(pacmd list-sinks | grep index | \
awk '{ if ($1 == "*") print "1"; else print "0" }'))
inputs=($(pacmd list-sink-inputs | grep index | awk '{print $2}'))
#find active sink
active=0
for i in ${sinks[*]}
do
if [ $i -eq 0 ]
then active=$((active+1))
else break
fi
done
#switch to next sink
swap=$(((active+1)%${#sinks[@]}))
pacmd set-default-sink $swap &> /dev/null
for i in ${inputs[*]}; do pacmd move-sink-input $i $swap &> /dev/null; done
我所做的不同是a)在for循环中找到活动接收器。b)通过将索引增加1来切换到下一个接收器。然后根据接收器的数量对结果求模。这样可以确保例如,当有3个接收器时,(2 + 1)%3 = 0。因此,我们从接收器索引2切换到接收器索引0。
这样,开关允许通过可用的水槽向上移动。
感谢您的脚本!我还为输入(麦克风)添加了一个部件,以防有人使用它:
while read line ; do
case $line in
*\*\ index*) x=1 ;;
index*) x=0 ;;
name*)
source=$(echo $line | sed -e "s/.*<//;s/>.*//")
if [[ $x = "0" ]] ; then
pacmd set-default-source $source &> /dev/null
fi ;;
esac
done < <(pacmd list-sources | grep -e alsa_input -e index)
要循环浏览声音设备列表,请使用以下脚本:
#!/bin/bash
declare -i sinks=(`pacmd list-sinks | sed -n -e 's/\**[[:space:]]index:[[:space:]]\([[:digit:]]\)/\1/p'`)
declare -i sinks_count=${#sinks[*]}
declare -i active_sink_index=`pacmd list-sinks | sed -n -e 's/\*[[:space:]]index:[[:space:]]\([[:digit:]]\)/\1/p'`
declare -i next_sink_index=${sinks[0]}
#find the next sink (not always the next index number)
declare -i ord=0
while [ $ord -lt $sinks_count ];
do
echo ${sinks[$ord]}
if [ ${sinks[$ord]} -gt $active_sink_index ] ; then
next_sink_index=${sinks[$ord]}
break
fi
let ord++
done
#change the default sink
pacmd "set-default-sink ${next_sink_index}"
#move all inputs to the new sink
for app in $(pacmd list-sink-inputs | sed -n -e 's/index:[[:space:]]\([[:digit:]]\)/\1/p');
do
pacmd "move-sink-input $app $next_sink_index"
done
#display notification
declare -i ndx=0
pacmd list-sinks | sed -n -e 's/device.description[[:space:]]=[[:space:]]"\(.*\)"/\1/p' | while read line;
do
if [ $(( $ord % $sinks_count )) -eq $ndx ] ; then
notify-send -i notification-audio-volume-high --hint=string:x-canonical-private- synchronous: "Sound output switched to" "$line"
exit
fi
let ndx++
done;
所有功劳归功于Ubuntu论坛上的tsvetan 。
我一直在寻找一种方法来在笔记本电脑的内置扬声器和插入立体声系统的Apple Airport基站之间切换。我决定分配热键进行切换。我希望音频偏好设置窗口弹出一秒钟,以便对开关进行视觉确认,然后使用wmctrl关闭该窗口。
(我将ctrl + F8和ctrl + F9用作热键,因为笔记本电脑上这些键的Fn功能是增大和减小音量,因此让ctrl函数更改音频输出似乎很明显。)
我使用了以下2个(几乎相同)的脚本:
#! /bin/bash
gnome-volume-control -p output &
sleep .7
pacmd set-default-sink 1
sleep .8
wmctrl -c "Sound Preferences"
exit
#! /bin/bash
gnome-volume-control -p output &
sleep .7
pacmd set-default-sink 0
sleep .8
wmctrl -c "Sound Preferences"
exit
第一个更改为苹果基站(我将其分配给ctrl + F9),第二个切换回内部扬声器(ctrl + F8)。假定这些是安装的仅有2个输出设备。
我建立在安德鲁斯脚本的基础上,使其使用notify-osd宣布它刚刚做了什么。根据需要编辑带有名称的行。
#!/usr/bin/env bash
sinks=($(pacmd list-sinks | grep index | \
awk '{ if ($1 == "*") print "1",$3; else print "0",$2 }'))
inputs=($(pacmd list-sink-inputs | grep index | awk '{print $2}'))
[[ ${sinks[0]} = 0 ]] && swap=${sinks[1]} || swap=${sinks[3]}
pacmd set-default-sink $swap
for i in ${inputs[*]}; do pacmd move-sink-input $i $swap &> /dev/null; done
if [ "$swap" = "0" ]; then
notify-send -u normal -i audio-volume-medium-symbolic "Sound output changed. Now using: Corsair 2.1 Speakers!"
else
notify-send -u normal -i audio-volume-medium-symbolic "Sound output changed. Now using: Logitech G930 Headset!"
fi
我遇到了同样的问题,并为Ubuntu Unity桌面编写了一个小指示器小程序:
这是一个循环当前当前焦点窗口的音频接收器的小脚本:https : //gist.github.com/rif/01ffb5e3eb45d2e4e6ebb4652b3b19ce
需要pacmd和xdotool