当前位置: 首页>>技术教程>>正文


音频输出设备,快速切换?

, ,

问题描述

根据情况,我使用扬声器或耳机进行音频输出。鉴于我的耳机是 USB 耳机,它可以作为自己的音频设备使用。

目前,我通过单击右上角托盘中的扬声器图标在音频输出设备之间切换,我在其中选择声音设置,转到输出选项卡,然后选择我想要的设备。

我想知道是否有更简单/更快捷的方式来回切换到我的 USB 耳机?也许是一个专用的托盘图标、一个键映射等等?

我正在使用默认的 Gnome 桌面运行 Ubuntu 10.04。

最佳回答

为了从命令行更改默认音频输出设备,您可以使用 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 行的逻辑。

  • 只是交换默认接收器设备不会对当前运行的应用程序做任何事情,它们将继续输出到以前的设备。此脚本还会移动所有现有输入的接收器目标。也就是说,如果您在一台设备上播放音乐的情况下运行此脚本,它会立即切换到另一台设备。如果您希望现有应用程序在以前的设备上继续运行,请注释掉最后一行(如果您愿意,还可以注释掉第 5 行)。

次佳回答

好吧,你可以安装 pavucontrol ,它会在第一个选项卡上显示带有声音设备选择的应用程序,这会节省你一些精力。但我认为你真正想要的是将你的 USB 耳机标记为默认设备,然后每次你插入时所有声音都会被重定向到它,当你拔出它时 – 它会回到扬声器。毫不费力,真的。

第三种回答

当然,使用 Applet 切换设备也可以正常工作。但是编写脚本的妙处在于它非常快。例如,我将我的放在键盘快捷键 alt+s 上。因此,当我想从耳机切换到扬声器时,我只需要按 alt+s。

反正。安德鲁说:

\\n

If you have more than two audio devices and want to swap to a\\n different one, you’ll need to replace the logic on line 7 with some\\n conditionals.

\\n

我就是这么做的。我分享它,以防有人遇到麻烦:

#!/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。

通过这种方式,开关允许向上移动通过可用的水槽。

第四种回答

这个问题很老,但我的回答可能对 GNOME 2 用户仍然有用。我使用 PulseAudio Mixer Applet 来解决此处描述的确切问题。您可以直接在面板菜单中更改输入和输出设备。这是我找到的最方便的方法。

第五种回答

要循环浏览声音设备列表,请使用以下脚本:

#!/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 forum 的 tsvetan。

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/13491.html,未经允许,请勿转载。