如何仅切换一个应用程序的音频

如何仅切换一个应用程序的音频

要切换到 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

在此处输入图片描述

答案1

脉冲音频我们可以从命令行选择输出接收器:

pacmd set-default-sink "SINKNAME"

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

pacmd list-sinks

笔记:通过命令行界面更改输出接收器只有在以下情况下才会生效流目标设备读取被禁用。可以通过将相应的行编辑/etc/pulse/default.pa为:

load-module module-stream-restore restore_device=false

或者,我们可以运行 pulseaudio 同时将声音输出到内部音频设备和 hdmi 设备,方法是运行帕普雷夫可以选择添加虚拟输出设备:

帕普雷夫

答案2

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

#!/bin/bash

CURRENT_PROFILE=$(pacmd list-cards | grep "active profile" | cut -d ' ' -f 3-)

if [ "$CURRENT_PROFILE" = "<output:hdmi-stereo+input:analog-stereo>" ] ; 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

然后绑定键盘上未使用的键来执行它(参见)。

答案3

编辑

此答案/解释的代码已过时,并且存在一些错误。我在此保持更新:https://github.com/madacol/sinkSwitcher


如何仅切换一个应用程序的音频

在 Ubuntu 16 和 18 上测试过


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

该脚本检测焦点所在的应用程序,找到从中播放的所有音频,并将其切换到下一个可用的输出设备。

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,每行列出一个接收器输入,并在同一行显示其索引、接收器和 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 <alsa_output.pci-0000_00_00.1.hdmi-stereo-extra1> application.process.id = 3521
  181 sink: 1 <alsa_output.pci-0000_00_01.0.analog-stereo> application.process.id = 2733
  182 sink: 0 <alsa_output.pci-0000_00_00.1.hdmi-stereo-extra1> application.process.id = 13752

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

  # 182 sink: 0 <alsa_output.pci-0000_00_00.1.hdmi-stereo-extra1> application.process.id = 13752

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

然后我们遍历每一行

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

将这两部分放在一起,我们得到这个命令

pacmd list-sink-inputs |
    grep -E 'index:|sink:|process.id' |
    tr '\n' ' ' |
    tr -d '"' |
    sed -e 's/index:/\n/g' |
    tail -n +2 |
    while IFS= read -r line || [ -n "$line" ]; do
        sink_input_pid=$(echo $line | awk '{print $NF}')
        ...
    done

从这里开始的所有内容都进入上面while的循环


仅过滤与焦点应用的 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[@]}

寻找下一个接收器,我们必须遍历接收器列表,以知道哪一个匹配当前接收器索引并了解下一个接收器的索引。

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

最后,我们将接收器输入移至下一个接收器索引

pacmd move-sink-input $sink_input_index $next_sink_index

关于 Ubuntu 16.04 的注意事项:

配置快捷键时,我无法使其与 ubuntu 的快捷键管理器配合使用。因此我不得不安装compizconfig-设置管理器

sudo apt-get install compizconfig-settings-manager

答案4

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

相关内容