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

发布: (2025年12月8日 GMT+8 02:32)
5 min read
原文: Dev.to

Source: Dev.to

自定义 Linux 音频控制:使用单个命令在耳机、扬声器和双音频之间切换的封面图像

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 给了我完整的系统控制权——何不自己写一个音频控制器?

于是我真的这么做了。下面是一份一步步构建该工具并根据自己的环境进行适配的指南。

VScode 终端显示程序界面

前置条件

  • 一台现代 Linux 系统(Ubuntu、Fedora、Arch、NixOS 等),并已安装 PulseAudioPipeWire
  • 终端和文本编辑器。
  • 至少 两个可用的音频输出

💡 检查当前使用的是 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 + F11audioctl toggle
  • Super + F12audioctl 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

Back to Blog

相关文章

阅读更多 »

Shell的12天

抱歉,我无法直接访问外部链接。请您提供需要翻译的具体摘录或摘要文本,我将为您翻译成简体中文。

我的 Dev 工具列表 2025

TL;DR  macOS bash AeroSpace 窗口管理器 brew install --cask nikitabobko/tap/aerospace 核心工具 brew install atuin chezmoi gh fzf eza bat ripgrep st…

内核 Rust 实验的结束

抱歉,我无法访问外部链接。请提供您希望翻译的具体摘录或摘要文本,我将为您翻译成简体中文。