本页目录
媒体操作手册
音频/视频相关操作,包括 PipeWire 管理、音量控制、设备路由、录制和故障排查。
架构概览
关键概念:
- PipeWire = 统一的音视频服务, 同时替代 PulseAudio 和 JACK
- WirePlumber = 设备热插拔/自动路由策略 (谁插了耳机、切了 HDMI 输出)
- pipewire-pulse = PulseAudio 兼容层, 让 PA 应用透明使用 PipeWire
- pactl 操作的是 pipewire-pulse, wpctl 操作的是 PipeWire 原生层
状态查看
# 服务状态
# PipeWire 原生信息
# WirePlumber 设备
# PulseAudio 兼容层
# 硬件
|
音量控制
# wpctl (推荐, PipeWire 原生)
# pactl (PulseAudio 兼容层)
# amixer (ALSA 底层, 直接调硬件)
音频路由 (切换输出设备)
# 列出可用 sinks 并切换
# 迁移当前播放流到指定 sink
# 切换到特定设备 (按名称)
SINK=
# 查看声卡 profile (模拟/数字/HDMI 切换)
WirePlumber / PipeWire 重启
# 重启整个音频栈 (软重启, 应用不自知)
# 单独重启 WirePlumber (设备列表刷新)
# 完全重置 (先 kill 再起)
故障排查
# 1. 检查是否有声音输出
# 2. 检查 pipewire-pulse 是否僵死 (常见: Chrome 视频卡死)
# 修复: systemctl --user restart pipewire-pulse
# 3. 检查是否有进程独占声卡
# 4. 检查 ALSA 层是否正常
# 如果 ALSA 直接播正常但 PipeWire 没声 → PipeWire 层问题
# 如果 ALSA 也报错 → 驱动/硬件问题
# 5. USB/HDMI 热插拔没反应
# 6. 蓝牙音频
# 连上后 wireplumber 自动创建 BT sink, wpctl status 可见
# 没出现: systemctl --user restart wireplumber
# 7. 同时多输出 (如有需要)
# 卸载: pactl unload-module module-combine-sink
常见症状速查
| 症状 | 可能原因 | 命令 |
|---|---|---|
| Chrome 视频进度条不走, 有缓冲 | pipewire-pulse 僵死 | systemctl --user restart pipewire-pulse |
| 完全没声 | 默认 sink 错了 | wpctl status 看 default sink |
| 插耳机不自动切 | WirePlumber 没反应过来 | systemctl --user restart wireplumber |
| 某些应用出声某些不出 | 走了不同 sink | pactl list sink-inputs 看路由 |
| 蓝牙耳机连上没声 | BT profile 掉了 | pactl list cards 看 profile |
录制
# 屏幕录制 (PipeWire + wf-recorder, Wayland 原生)
# 音频录制 (PipeWire)
# PulseAudio 兼容
# 截图 (Wayland/Hyprland)
|
音量/媒体键
Hyprland 媒体键绑定示例 (hyprland.lua):
-- 音量控制 (wpctl)
hl.dsp.bind({"SUPER"}, "XF86AudioRaiseVolume", function() hl.exec("wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%+") end)
hl.dsp.bind({"SUPER"}, "XF86AudioLowerVolume", function() hl.exec("wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-") end)
hl.dsp.bind({"SUPER"}, "XF86AudioMute", function() hl.exec("wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle") end)
hl.dsp.bind({"SUPER"}, "XF86AudioMicMute", function() hl.exec("wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle") end)
-- 播放控制 (playerctl, 需要安装)
hl.dsp.bind({}, "XF86AudioPlay", function() hl.exec("playerctl play-pause") end)
hl.dsp.bind({}, "XF86AudioNext", function() hl.exec("playerctl next") end)
hl.dsp.bind({}, "XF86AudioPrev", function() hl.exec("playerctl previous") end)
playerctl 其他用法:
视频/编解码信息
|
# 查看硬件编解码支持
| |
固件
# AMD GPU 固件 (编解码/显示)
|
# SOF (Sound Open Firmware, Intel 音频 DSP)
|