在模拟立体声输出和HDMI音频输出之间切换的快捷方式

要切换到HDMI音频输出(显示器)并从系统音频插孔返回正常音频输出(对于耳机,因为我的显示器没有音频输出),我发现自己打开声音首选项并每次选择正确的频道。 有没有办法我可以在面板中创建一个切换按钮或指定一些快捷键来切换,因为我经常进行切换。

:aplay -l **** List of PLAYBACK Hardware Devices **** card 0: Intel [HDA Intel], device 0: STAC92xx Analog [STAC92xx Analog] Subdevices: 1/1 Subdevice #0: subdevice #0 card 0: Intel [HDA Intel], device 3: HDMI 0 [HDMI 0] Subdevices: 0/1 Subdevice #0: subdevice #0 card 0: Intel [HDA Intel], device 7: STAC92xx Digital [STAC92xx Digital] Subdevices: 1/1 Subdevice #0: subdevice #0 

在此处输入图像描述

使用pulseaudio,我们可以从命令行中选择输出接收器:

 pacmd set-default-sink "SINKNAME" 

此命令可用于启动器,脚本或甚至分配给键盘快捷键,以便在不同的接收器之间快速切换。 请将“SINKNAME”替换为所需接收器的名称或编号。 命令给出了已知接收器及其关联数字和名称的列表:

 pacmd list-sinks 

注意:通过命令行界面更改输出接收器只有在禁用流目标设备读取时才会生效。 这可以通过编辑/etc/pulse/default.pa的对应行来完成:

 load-module module-stream-restore restore_device=false 

或者,我们可以通过运行paprefs并添加虚拟输出设备来运行pulseaudio同时将声音输出到内部音频设备和hdmi设备:

paprefs

我发现这非常烦人,并编写了一个脚本来切换输出:

 #!/bin/bash CURRENT_PROFILE=$(pacmd list-cards | grep "active profile" | cut -d ' ' -f 3-) if [ "$CURRENT_PROFILE" = "" ] ; then pacmd set-card-profile 0 "output:analog-stereo+input:analog-stereo" else pacmd set-card-profile 0 "output:hdmi-stereo+input:analog-stereo" fi 

然后在键盘上绑定一个未使用的键来执行它(请参阅如何将自定义命令绑定到键盘快捷键? )

又一个接收器切换器脚本

在Ubuntu 16.04上测试过


但是这个只允许您切换所需应用程序的音频。

用法:聚焦您想要更改其接收器的应用程序并运行此脚本。 而已!!!

此脚本检测处于焦点的应用程序,查找从中播放的所有音频,并将它们切换到下一个可用的接收器。

https://gist.github.com/madacol/1a0d8569166886d2d98f073f7f5c5fe3

解释脚本

我们需要在焦点上找到应用程序的PID

但首先我们需要xid

 xprop -root _NET_ACTIVE_WINDOW 

然后将其插入$xid以获取应用程序的pid

 xprop -id $xid _NET_WM_PID 

现在我们需要找到与该PID相关的接收器输入

首先让线性化命令pacmd list-sink-inputs的输出,每行列出一个sink-input,在同一行显示其索引,sink和pid

 pacmd list-sink-inputs | grep -E 'index:|sink:|process.id' | tr '\n' ' ' | tr -d '"' | sed -e 's/index:/\n/g' | tail -n +2 

让我们一步一步地分析它:

grep -E 'index:|sink:|process.id只保留包含index:sink:process.id

tr '\n' ' '加入所有行

tr -d '"'删除所有"字符。 必须得到没有引号的pid

sed -e 's/index:/\n/g'用新行字符替换所有index:出现次数\n

tail -n +2删除第一行,因为它是空的

结果是这样的:

  180 sink: 0  application.process.id = 3521 181 sink: 1  application.process.id = 2733 182 sink: 0  application.process.id = 13752 

让我们分析一行来理解它的含义:

  # 182 sink: 0  application.process.id = 13752 

182是宿输入索引, 0是宿索引,最后是13752 ,是所属应用程序的pid

然后我们遍历每一行

 ... | while IFS= read -r line || [ -n "$line" ]; do sink_input_pid=$(echo $line | awk '{print $NF}') 

最后只过滤与聚焦应用程序的pid匹配的接收器输入的pid

  if [ $sink_input_pid = $app_pid ]; then 

提取数据

使用awk我们可以获得所需的元素

 sink_input_index=$(echo $sink_input | awk '{print $1}') current_sink_index=$(echo $sink_input | awk '{print $3}') 

获取接收器的数量,以了解接收器的旋转何时应从0重新开始。

 sink_list_size=${#sink_list_array[@]} 

找到下一个接收器,我们必须遍历接收器列表,知道哪个匹配current_sink_index并知道下一个接收器的索引。

 i=0 for sink in "${sink_list_array[@]}"; do i=$((($i+1)%sink_list_size)) # i++ mod(#sinks) if [ $sink = $current_sink_index ]; then next_sink_index=${sink_list_array[i]} break fi done 

最后,我们将sink-input移动到next_sink_index中

 pacmd move-sink-input $sink_input_index $next_sink_index 

关于Ubuntu 16.04的注意事项:

配置快捷键时,我无法使用ubuntu的快捷方式管理器。 所以我不得不安装compizconfig-settings-manager

 sudo apt-get install compizconfig-settings-manager 

如果您使用的是Gnome Shell而不是Unity,则可以在下面安装扩展程序。 然后,您就可以从顶部面板中的音量快捷方式切换。 https://extensions.gnome.org/extension/142/output-device-chooser-on-volume-menu/

由于屏幕截图中只能看到一个声卡,我认为应该切换此声卡的输出

例如:我有一个带有一个集成声卡的笔记本电脑,但在对接时它有一个数字输出(SPDIF)。

所以我想要做的是在pulseaudio中切换有效输出或“Profile”。

我找到了那样做的命令:

 pacmd set-card-profile 0 output:analog-stereo pacmd set-card-profile 0 output:iec958-stereo+input:analog-stereo 

我做了什么来获得我想要的输出设置的正确名称 – 这里,数字输出,但模拟(微)输入 – 是:

 pacmd list | grep output 

我一直在努力寻找这个问题的解决方案。 从Ubuntu 11.04开始,这似乎不可能直接使用,我只发现本指南将HDMI和Analog都添加为单独的输出,因此pacmd现在显示3个接收器。 然后可以使用上述命令在接收器之间切换。 ( 另见 )

但显然Ubuntu 11.11将获得带有插孔检测系统的PulseAudio。 根据下面的网站,David Henningsson已经通过udev对检测进行了编码,因此脉冲音频会自动切换到最后添加的输出,包括在同一声卡的不同配置文件之间切换(就像您和我的设置一样)。 (见这里 )

所以当我下周五试用最终版时,我希望这会有效。

有什么办法可以在面板中创建一个切换按钮

我写了一个指示器小程序,可以让你切换声音输出(见截图)。

https://github.com/lkettenb/sound-output-switcher

截图: http : //www.capslockblog.com/images/misc/Screenshot.png

根据之前的许多答案,我编写了一个脚本,将回放接收器设置为可用的回放接收器。

使用它的最佳方法是创建一个键盘快捷键来运行它,因此每次按下该组合键时,音频都会重定向到下一个可用的接收器。

代码可在此处获取: https : //gist.github.com/germank/7fa2fb07d45a838bf890addadd8bea8c

在我的情况下,模拟选项不在列表中。 安装pavucontrol: sudo apt install pavucontrol

可以通过启动应用程序来解决问题:

  1. 通过终端启动应用程序,输入: pavucontrol (enter)
  2. 转到“配置”选项卡。
  3. 在Intern Sound中选择Analoge立体声输出配置文件

在此处输入图像描述

现在我可以在这里发声并选择不同的配置文件(在Linux Mint下):

在此处输入图像描述

在Ubuntu 16.04上测试过

作为Sound Switcher Indicator的替代品(需要添加PPA):

在一个命令中

在我的情况下是hdmi-stereo-extra1+input配置文件,因此在一行中将是:

 [[ $(pacmd list-cards | grep "active profile" | cut -d " " -f 3-) = "" ]] && \ pacmd set-card-profile 0 "output:analog-stereo+input:analog-stereo" || \ pacmd set-card-profile 0 "output:hdmi-stereo-extra1+input:analog-stereo" 

您可以使用自定义快捷方式使用bash -c执行它(如果与其他快捷方式有任何冲突,则会发出警告):

截图 截图

我用:

  • Super + Alt + o :切换输出
  • Super + Alt + Up :Vol Up
  • Super + Alt + Down :Vol Down

您还可.bashrc添加alias

在脚本中

我根据@ user829996回答做了一些更改:

 #!/bin/bash set -euo pipefail # strict mode activeProfile() { pacmd list-cards | grep "active profile" | cut -d " " -f 3-; } CURRENT_PROFILE="$(eval activeProfile)" # If it doesn't work run pacmd list-cards and try the other outputs from profile section ANALOG_PROFILE="output:analog-stereo+input:analog-stereo" HDMI_PROFILE="output:hdmi-stereo-extra1+input:analog-stereo" if [ "$CURRENT_PROFILE" = "" ] ; then pacmd set-card-profile 0 "$ANALOG_PROFILE" else pacmd set-card-profile 0 "$HDMI_PROFILE" fi activeProfile