在 Ubuntu 和其他发行版中,有一个图形化的东西可以切换音频输出设备。我尝试编写一个命令行工具来执行相同的操作,但它并不总是有效。
我正在做的切换到接收器 0 的操作如下:
pacmd set-default-sink 0
我认为这应该使所有新的输入转到接收器 0。然后,对于每个现有输入,根据pacmd list-sink-inputs
我正在做的:
pacmd move-sink-input <input_id> 0
但它常常不起作用。我经常会切换接收器,然后在某些应用程序中播放一些音频,它仍然会连接到旧接收器。我在这里缺少什么?我怎样才能稳健地做到这一点?
答案1
从这篇博文:
PulseAudio 本身附带两个基本的命令行工具,称为 pacmd 和 pactl。前者提供了 set-default-sink 命令,但这并没有达到您的预期。事实证明,至少在我的系统上,PulseAudio 守护进程会为曾经连接到它的每个应用程序保留持久设置。这意味着默认接收器仅用于守护进程尚未见过的应用程序。
换句话说,这位博主遇到了与您完全相同的问题:
- 切换默认接收器仅影响之前未使用过的程序
- 移动现有输入仅影响声卡实际活动的程序
- 您需要一个工具来遍历持久设置并将它们重新指向新卡。
因此,这位博主编写了paswitch
一个命令行工具来完成此任务。
您可以在此处找到 Git 格式的源代码。
安装:
- 确保您
libpulse-dev
安装了 Pulseaudio 开发库包(或类似的包)。您还需要gcc
编译器和make
实用程序。 - 运行
git clone https://www.tablix.org/~avian/git/paswitch.git
下载源代码。 cd paswitch
进入命令创建的目录git clone
,然后运行make
.paswitch
如果完成且没有错误,目录中现在应该有一个二进制文件。将其复制到您的/usr/local/bin/
目录中。- 阅读
README
目录中的文件以获取有关如何使用它的示例。
另一种选择是告诉 PulseAudio 守护进程不要保留应用程序的接收器设置,方法是将选项添加restore_device=false
到以下module-stream-restore
行中/etc/pulse/default.pa
:
load-module module-stream-restore restore_device=false
执行此操作并重新启动 PulseAudio 后,切换默认接收器将导致所有新的声音应用程序默认使用它。
但你的情况可能会有所不同,具体取决于你使用的桌面环境:在我的 Debian 9 上,禁用持久性会导致 KDE 出现其他恼人的行为,我最终返回到默认行为。如果我没记错的话,它会导致 KDE 系统设置 -> 多媒体 -> 音频和视频 -> 设备首选项列表在每次登录时获取我的音频设备的新副本。