Linux 自定义音频控制:使用单个命令在耳机、扬声器和双音频之间切换
Source: Dev.to

TL;DR: 我写了一个叫 audioctl 的脚本,只需一个命令就能在耳机(通过 HDMI)、模拟扬声器之间切换,或 同时在两者上播放音频。全部使用 pactl、一点 Bash 和 Linux 的强大能力实现。
什么是 pactl?
pactl(全称 PulseAudio Control)是一个命令行工具,用于控制 PulseAudio 音频服务器,且在兼容模式下同样支持 PipeWire——后者是 PulseAudio 的现代继任者,已成为 Fedora、Ubuntu 22.04+、Arch、NixOS 等发行版的默认音频系统。
使用它可以:
- 列出音频设备(sink 与 source)
- 调整音量
- 切换输出
- 在设备之间移动音频流
- 加载或卸载模块(如
module-combine-sink)
它是终端音频的 “瑞士军刀”,也是本教程所有内容的基石。
问题
我的使用环境很简单却很常见:
- 耳机 通过 HDMI 连接到显示器,显示器再通过 HDMI 连接到电脑。
- 扬声器 直接连接到电脑的模拟音频输出。
我的岳父需要在扬声器和耳机之间切换——这在 UI 中已经可以做到——但他还希望能够 同时启用两者(出于无障碍需求)。
于是我想:Linux 给了我完整的系统控制权——何不自己写一个音频控制器?
于是我真的这么做了。下面是一份一步步构建该工具并根据自己的环境进行适配的指南。
前置条件
- 一台现代 Linux 系统(Ubuntu、Fedora、Arch、NixOS 等),并已安装 PulseAudio 或 PipeWire。
- 终端和文本编辑器。
- 至少 两个可用的音频输出。
💡 检查当前使用的是 PipeWire 还是 PulseAudio:
pactl info | grep "Server Name"
如果显示 “PipeWire” 或 “PulseAudio”,说明可以继续。
第一步:了解你的音频配置
列出 sinks(音频输出)
pactl list sinks short
示例输出
52 alsa_output.pci-0000_01_00.1.hdmi-stereo ... RUNNING
57 alsa_output.pci-0000_09_00.6.analog-stereo ... SUSPENDED
RUNNING= 当前正在使用SUSPENDED= 已就绪但空闲
列出音频卡
pactl list cards
查找模拟设备并确认 活动配置文件(例如 output:analog-stereo)。
第二步:基本音量控制
pactl 可以使用特殊标识符 @DEFAULT_SINK@ 来控制默认 sink 的音量。
# 音量提升 5%
pactl set-sink-volume @DEFAULT_SINK@ +5%
# 音量降低 5%
pactl set-sink-volume @DEFAULT_SINK@ -5%
第三步:切换音频输出
设置默认 sink:
pactl set-default-sink SINK_NAME
手动移动正在播放的流:
pactl list short sink-inputs
pactl move-sink-input STREAM_ID NEW_SINK
第四步:同时在两个设备上播放(双模式)
创建一个组合 sink,使音频同时转发到 HDMI 与模拟输出:
pactl load-module module-combine-sink \
sink_name=combined_output \
slaves=alsa_output.hdmi,alsa_output.analog \
sink_properties=device.description="Dual_HDMI+Analog"
第五步:最终脚本 — audioctl
#!/usr/bin/env bash
# audioctl – 简单的音频输出切换器
# (完整脚本为简洁起见已省略;完整代码见 “完整代码” 部分)
# 示例骨架:
# - 检测可用 sinks
# - 接受命令: toggle, speakers, headphones, dual
# - 使用 pactl 设置默认 sink 或加载组合 sink
安装
chmod +x ~/projects/audioctl
mkdir -p ~/bin
ln -sf ~/projects/audioctl ~/bin/audioctl
确保 ~/bin 已加入 PATH:
export PATH="$HOME/bin:$PATH"
重新加载 shell 配置:
source ~/.bashrc
额外技巧
使用持续音频进行测试:
speaker-test -t wav -c 2
键盘快捷键(GNOME/KDE/i3)
Super + F11→audioctl toggleSuper + F12→audioctl dual
调试与有用参考
快速调试命令:
pactl list sinks short
pactl get-default-sink
pactl list short sink-inputs
pactl list cards
官方参考
- PulseAudio CLI 文档
- PipeWire 文档
module-combine-sink文档
结论
仅用 不到 60 行 Bash,我解决了一个实际问题——并获得了图形界面无法提供的灵活性。
✨ 控制权就在你手中,也就在终端里。
完整代码
https://gist.github.com/igorgbr/8031267dee77acf6d7d298ec72a37f94