[Internal testing communication] 如果在deepin25下用hdmi输出音频,遇到突然没有声音,解决办法
Tofloor
poster avatar
qq4945286
deepin
2026-09-09 11:13
Author

在deepin下用hdmi做音频输出时,会遇到突然没有声音的情况。

以前都要注销系统或重启。这样会比较麻烦,后来就用ai写了一个脚本。

如果遇到突然没有声音了就运行一下脚本。

这样就不会关闭打开或退出已经打开的文件或程序,只是电脑屏幕会闪两下,这样声音就正常了。下面是脚本代码。

#!/bin/bash
# fix-dp-audio:修复显示器唤醒后 HDMI/DP 音频无声
# 原理:切换刷新率两次,强制 DP 链路重新协商音频通道(等效注销,免重启)
# 用法:直接运行,屏幕会闪两下,随后自动播放测试音

OUT="${1:-DP-2}"

info=$(wlr-randr 2>/dev/null)
[ -z "$info" ] && { echo "错误:wlr-randr 不可用(仅 treeland/Wayland 会话有效)"; exit 1; }

# 解析当前分辨率和刷新率
cur=$(echo "$info" | grep "current" | head -1)
[ -z "$cur" ] && { echo "错误:未找到当前显示模式"; exit 1; }
mode=$(echo "$cur" | awk '{print $1}')
hz=$(echo "$cur" | grep -oE '[0-9]+(\.[0-9]+)? Hz' | grep -oE '[0-9.]+')

# 找同分辨率的其他刷新率作为中转
alt=$(echo "$info" | grep "^[[:space:]]*$mode px" | grep -oE '[0-9]+\.[0-9]+ Hz' | grep -v "^$hz" | grep -oE '[0-9.]+' | head -1)

if [ -z "$alt" ]; then
    echo "错误:分辨率 $mode 没有其他刷新率可切换,请手动改一次分辨率再改回"
    exit 1
fi

echo "当前:$OUT ${mode}@${hz}Hz"
echo "切换到 ${alt}Hz 再切回,重建 DP 链路(屏幕会闪两下)..."

wlr-randr --output "$OUT" --mode "${mode}@${alt}Hz"
sleep 4
wlr-randr --output "$OUT" --mode "${mode}@${hz}Hz"
sleep 3

echo "播放测试音,听到\"叮\"即修复成功"
paplay /usr/share/sounds/freedesktop/stereo/bell.oga 2>/dev/null
echo "完成。仍无声时运行 wlr-randr 检查显示器状态"

可以用ai根据自己的实际情况进行完善。

Reply Favorite View the author
All Replies
avatar
qq4945286
deepin
2026-09-09 11:15
#1

不知道这个问题,到时官方能不能修复。

Reply View the author
avatar
剑风澜
deepin
2026-09-09 11:34
#2

我也遇到了,重启、注销,无效。

平台:i5 12400+A380 index ,音频联显示器【HDMI】。

以下是deepseek方案。

收到!这是典型的 PipeWire 省电机制(Sink Suspend) 在闲置后自动将音频设备挂起,导致声音无声。您当前加载的 my_analog sink 可能被挂起,或者默认 sink 被系统重置回 HDMI 或数字输出。


🔍 第一步:诊断当前状态

请执行以下命令,并将输出发给我:

pactl list sinks short
pactl get-default-sink

这会显示所有 sink 及其状态(是否 SUSPENDED),以及当前默认 sink 是哪个。


💡 临时解决:手动唤醒并重新设置默认

如果发现 my_analog 存在但状态为 SUSPENDED,您只需唤醒它:

pactl set-sink-suspend my_analog 0   # 0=唤醒,1=挂起
pactl set-default-sink my_analog

然后播放音频(如 speaker-test),应该会恢复声音。


🔧 永久解决:调整 PipeWire 省电策略

方法一:在自动启动脚本中加入唤醒命令(推荐,安全)

修改我们之前创建的 setup_audio.desktop,让它不仅加载 sink,还额外设置禁用挂起:

cat > ~/.config/autostart/setup_audio.desktop << 'EOF'
[Desktop Entry]
Type=Application
Name=Setup Analog Sink
Exec=bash -c "sleep 3 && pactl load-module module-alsa-sink device=hw:0,0 sink_name=my_analog && pactl set-default-sink my_analog && pactl set-sink-suspend my_analog 0"
Hidden=false
NoDisplay=false
X-GNOME-Autostart-enabled=true
EOF

重启后,每次登录都会唤醒 sink 并设为默认。

方法二:全局禁用 PipeWire 设备挂起(更彻底,但需注意配置文件)

既然您曾因配置文件出错导致服务启动失败,我推荐使用环境变量或用户配置方式来禁用挂起,避免语法错误。

创建用户级 PipeWire 配置(禁用挂起)

创建一个只包含 suspend 设置的配置文件,不涉及模块加载(避免语法风险):

mkdir -p ~/.config/pipewire/pipewire.conf.d
cat > ~/.config/pipewire/pipewire.conf.d/99-disable-suspend.conf << 'EOF'
context.properties = {
    # 禁用所有声卡的自动挂起(超时设为0表示永不挂起)
    default.clock.quantum-limit = 8192
}
alsa.properties = {
    # 针对 ALSA 设备,设置挂起超时为 0(禁用)
    suspend-timeout = 0
}
EOF

注意:这个文件只包含 context.properties 和 alsa.properties,不涉及模块加载,语法风险极低。但为了安全,请先测试:保存后执行 systemctl --user restart pipewire,如果服务正常启动,则永久生效。

如果担心,可以先用下面的方法三。

方法三:使用 pactl 定期唤醒(脚本循环)

在后台启动一个脚本,每隔几分钟检查并唤醒 sink。您可以将其加入自动启动,但稍显复杂,暂不推荐。


🚨 如果 my_analog sink 在闲置后消失

有时 PipeWire 在挂起后可能完全卸载动态加载的模块。这种情况下,我们可以在自动启动脚本中每次都重新加载(因为加载模块是幂等的,如果已存在会报错但无妨),所以我们的脚本其实已经包含了加载命令,它会在每次登录时重新加载一次,但如果系统在运行中卸载了模块,就无法自动恢复。

您可以考虑定时检测,将脚本放在 crontab 中每分钟检测一次,但较耗资源,不推荐。


✅ 最终建议

  1. 先执行第一步的诊断命令,告诉我当前状态。
  2. 根据状态,我们可以选用上述方法一(修改自动启动脚本)或方法二(禁用挂起)。
  3. 无论哪种,您都可以立即手动唤醒并恢复声音。

最稳妥的做法:修改自动启动脚本,加入唤醒命令,这样每次登录都正常,并且闲置后若再次挂起,您只需再次执行 pactl set-sink-suspend my_analog 0 即可(可以通过快捷键或点击一个桌面图标实现)。

如果您希望彻底禁用挂起,我可以帮您安全地创建配置文件(方法二),您只需复制粘贴,风险极小。

请先提供 pactl list sinks short 的输出,我会进一步为您定制解决方案。😊

Reply View the author
avatar
qq4945286
deepin
2026-09-09 11:46
#3
剑风澜:

我也遇到了,重启、注销,无效。

平台:i5 12400+A380 index ,音频联显示器【HDMI】。

以下是deepseek方案。

收到!这是典型的 PipeWire 省电机制(Sink Suspend) 在闲置后自动将音频设备挂起,导致声音无声。您当前加载的 my_analog sink 可能被挂起,或者默认 sink 被系统重置回 HDMI 或数字输出。


🔍 第一步:诊断当前状态

请执行以下命令,并将输出发给我:

pactl list sinks short
pactl get-default-sink

这会显示所有 sink 及其状态(是否 SUSPENDED),以及当前默认 sink 是哪个。


💡 临时解决:手动唤醒并重新设置默认

如果发现 my_analog 存在但状态为 SUSPENDED,您只需唤醒它:

pactl set-sink-suspend my_analog 0   # 0=唤醒,1=挂起
pactl set-default-sink my_analog

然后播放音频(如 speaker-test),应该会恢复声音。


🔧 永久解决:调整 PipeWire 省电策略

方法一:在自动启动脚本中加入唤醒命令(推荐,安全)

修改我们之前创建的 setup_audio.desktop,让它不仅加载 sink,还额外设置禁用挂起:

cat > ~/.config/autostart/setup_audio.desktop << 'EOF'
[Desktop Entry]
Type=Application
Name=Setup Analog Sink
Exec=bash -c "sleep 3 && pactl load-module module-alsa-sink device=hw:0,0 sink_name=my_analog && pactl set-default-sink my_analog && pactl set-sink-suspend my_analog 0"
Hidden=false
NoDisplay=false
X-GNOME-Autostart-enabled=true
EOF

重启后,每次登录都会唤醒 sink 并设为默认。

方法二:全局禁用 PipeWire 设备挂起(更彻底,但需注意配置文件)

既然您曾因配置文件出错导致服务启动失败,我推荐使用环境变量或用户配置方式来禁用挂起,避免语法错误。

创建用户级 PipeWire 配置(禁用挂起)

创建一个只包含 suspend 设置的配置文件,不涉及模块加载(避免语法风险):

mkdir -p ~/.config/pipewire/pipewire.conf.d
cat > ~/.config/pipewire/pipewire.conf.d/99-disable-suspend.conf << 'EOF'
context.properties = {
    # 禁用所有声卡的自动挂起(超时设为0表示永不挂起)
    default.clock.quantum-limit = 8192
}
alsa.properties = {
    # 针对 ALSA 设备,设置挂起超时为 0(禁用)
    suspend-timeout = 0
}
EOF

注意:这个文件只包含 context.properties 和 alsa.properties,不涉及模块加载,语法风险极低。但为了安全,请先测试:保存后执行 systemctl --user restart pipewire,如果服务正常启动,则永久生效。

如果担心,可以先用下面的方法三。

方法三:使用 pactl 定期唤醒(脚本循环)

在后台启动一个脚本,每隔几分钟检查并唤醒 sink。您可以将其加入自动启动,但稍显复杂,暂不推荐。


🚨 如果 my_analog sink 在闲置后消失

有时 PipeWire 在挂起后可能完全卸载动态加载的模块。这种情况下,我们可以在自动启动脚本中每次都重新加载(因为加载模块是幂等的,如果已存在会报错但无妨),所以我们的脚本其实已经包含了加载命令,它会在每次登录时重新加载一次,但如果系统在运行中卸载了模块,就无法自动恢复。

您可以考虑定时检测,将脚本放在 crontab 中每分钟检测一次,但较耗资源,不推荐。


✅ 最终建议

  1. 先执行第一步的诊断命令,告诉我当前状态。
  2. 根据状态,我们可以选用上述方法一(修改自动启动脚本)或方法二(禁用挂起)。
  3. 无论哪种,您都可以立即手动唤醒并恢复声音。

最稳妥的做法:修改自动启动脚本,加入唤醒命令,这样每次登录都正常,并且闲置后若再次挂起,您只需再次执行 pactl set-sink-suspend my_analog 0 即可(可以通过快捷键或点击一个桌面图标实现)。

如果您希望彻底禁用挂起,我可以帮您安全地创建配置文件(方法二),您只需复制粘贴,风险极小。

请先提供 pactl list sinks short 的输出,我会进一步为您定制解决方案。😊

下面是glm-5.3给的答案

为什么不适合

对比项 评论里的情况(剑风澜) 你的情况
硬件 Intel i5-12400 +A380 显卡 + HDMI RX 6600 XT + DP 连接
故障性质 PipeWire 省电挂起(软件层:sink 闲置后 SUSPENDED) DP 链路音频通道损坏(驱动/硬件协商层)
触发条件 音频闲置一段时间后无声 显示器休眠唤醒后无声(与闲置无关)
重启能否恢复 他重启/注销也无效 你重启/注销能恢复(我们验证过)
他的 my_analog 自己 module-alsa-sink 加载的板载声卡自定义 sink 你的 HDMI sink 是系统自动管理的,根本没有这个 sink

当时的诊断早已排除这个方向

9 月 5 日排查时我们确认过你的软件层完全正常:

  • sink 状态正常、Firefox 流正在播放、音量 80%、无 SUSPENDED
  • 裸 ALSA aplay 也能"成功播放”(但无声)
  • 问题出在 GPU 音频控制器与显示器的 DP 协商层——所以 pactl set-sink-suspend 唤醒、PipeWire 配置这些都够不到故障层
Reply View the author
avatar
剑风澜
deepin
2026-09-09 13:32
#4
qq4945286:

下面是glm-5.3给的答案

为什么不适合

对比项 评论里的情况(剑风澜) 你的情况
硬件 Intel i5-12400 +A380 显卡 + HDMI RX 6600 XT + DP 连接
故障性质 PipeWire 省电挂起(软件层:sink 闲置后 SUSPENDED) DP 链路音频通道损坏(驱动/硬件协商层)
触发条件 音频闲置一段时间后无声 显示器休眠唤醒后无声(与闲置无关)
重启能否恢复 他重启/注销也无效 你重启/注销能恢复(我们验证过)
他的 my_analog 自己 module-alsa-sink 加载的板载声卡自定义 sink 你的 HDMI sink 是系统自动管理的,根本没有这个 sink

当时的诊断早已排除这个方向

9 月 5 日排查时我们确认过你的软件层完全正常:

  • sink 状态正常、Firefox 流正在播放、音量 80%、无 SUSPENDED
  • 裸 ALSA aplay 也能"成功播放”(但无声)
  • 问题出在 GPU 音频控制器与显示器的 DP 协商层——所以 pactl set-sink-suspend 唤醒、PipeWire 配置这些都够不到故障层

那不知道......排查了很久的。

这是最后一版,才搞定了,现在用着正常了。

Reply View the author
avatar
一粒
deepin
2026-09-10 09:47
#5

这个症状是最近出现的吗?之前只在国产的部分硬件上遇到过休眠唤醒后没有声音的问题

Reply View the author
avatar
qq4945286
deepin
2026-09-10 13:50
#6
一粒:

这个症状是最近出现的吗?之前只在国产的部分硬件上遇到过休眠唤醒后没有声音的问题

在我的电脑上这个癌症就一直没有好过。不管是在x11还 是treeland下都会随时出现。而且不闲眠也会一不小就出现。特别是声音切换容易出现。

Reply View the author
avatar
一粒
deepin
2026-09-11 10:04
#7
剑风澜:

我也遇到了,重启、注销,无效。

平台:i5 12400+A380 index ,音频联显示器【HDMI】。

以下是deepseek方案。

收到!这是典型的 PipeWire 省电机制(Sink Suspend) 在闲置后自动将音频设备挂起,导致声音无声。您当前加载的 my_analog sink 可能被挂起,或者默认 sink 被系统重置回 HDMI 或数字输出。


🔍 第一步:诊断当前状态

请执行以下命令,并将输出发给我:

pactl list sinks short
pactl get-default-sink

这会显示所有 sink 及其状态(是否 SUSPENDED),以及当前默认 sink 是哪个。


💡 临时解决:手动唤醒并重新设置默认

如果发现 my_analog 存在但状态为 SUSPENDED,您只需唤醒它:

pactl set-sink-suspend my_analog 0   # 0=唤醒,1=挂起
pactl set-default-sink my_analog

然后播放音频(如 speaker-test),应该会恢复声音。


🔧 永久解决:调整 PipeWire 省电策略

方法一:在自动启动脚本中加入唤醒命令(推荐,安全)

修改我们之前创建的 setup_audio.desktop,让它不仅加载 sink,还额外设置禁用挂起:

cat > ~/.config/autostart/setup_audio.desktop << 'EOF'
[Desktop Entry]
Type=Application
Name=Setup Analog Sink
Exec=bash -c "sleep 3 && pactl load-module module-alsa-sink device=hw:0,0 sink_name=my_analog && pactl set-default-sink my_analog && pactl set-sink-suspend my_analog 0"
Hidden=false
NoDisplay=false
X-GNOME-Autostart-enabled=true
EOF

重启后,每次登录都会唤醒 sink 并设为默认。

方法二:全局禁用 PipeWire 设备挂起(更彻底,但需注意配置文件)

既然您曾因配置文件出错导致服务启动失败,我推荐使用环境变量或用户配置方式来禁用挂起,避免语法错误。

创建用户级 PipeWire 配置(禁用挂起)

创建一个只包含 suspend 设置的配置文件,不涉及模块加载(避免语法风险):

mkdir -p ~/.config/pipewire/pipewire.conf.d
cat > ~/.config/pipewire/pipewire.conf.d/99-disable-suspend.conf << 'EOF'
context.properties = {
    # 禁用所有声卡的自动挂起(超时设为0表示永不挂起)
    default.clock.quantum-limit = 8192
}
alsa.properties = {
    # 针对 ALSA 设备,设置挂起超时为 0(禁用)
    suspend-timeout = 0
}
EOF

注意:这个文件只包含 context.properties 和 alsa.properties,不涉及模块加载,语法风险极低。但为了安全,请先测试:保存后执行 systemctl --user restart pipewire,如果服务正常启动,则永久生效。

如果担心,可以先用下面的方法三。

方法三:使用 pactl 定期唤醒(脚本循环)

在后台启动一个脚本,每隔几分钟检查并唤醒 sink。您可以将其加入自动启动,但稍显复杂,暂不推荐。


🚨 如果 my_analog sink 在闲置后消失

有时 PipeWire 在挂起后可能完全卸载动态加载的模块。这种情况下,我们可以在自动启动脚本中每次都重新加载(因为加载模块是幂等的,如果已存在会报错但无妨),所以我们的脚本其实已经包含了加载命令,它会在每次登录时重新加载一次,但如果系统在运行中卸载了模块,就无法自动恢复。

您可以考虑定时检测,将脚本放在 crontab 中每分钟检测一次,但较耗资源,不推荐。


✅ 最终建议

  1. 先执行第一步的诊断命令,告诉我当前状态。
  2. 根据状态,我们可以选用上述方法一(修改自动启动脚本)或方法二(禁用挂起)。
  3. 无论哪种,您都可以立即手动唤醒并恢复声音。

最稳妥的做法:修改自动启动脚本,加入唤醒命令,这样每次登录都正常,并且闲置后若再次挂起,您只需再次执行 pactl set-sink-suspend my_analog 0 即可(可以通过快捷键或点击一个桌面图标实现)。

如果您希望彻底禁用挂起,我可以帮您安全地创建配置文件(方法二),您只需复制粘贴,风险极小。

请先提供 pactl list sinks short 的输出,我会进一步为您定制解决方案。😊

pipewire对所有的设备都会在暂停播放或者没有声音后进入挂起状态,这个是正常的。但是下次播放它又会进入到running状态。可以试试用系统音乐播放器,这个因为接口特性不会在暂停播放时进入suspend

Reply View the author
avatar
剑风澜
deepin
2026-09-11 10:38
#8
一粒:

pipewire对所有的设备都会在暂停播放或者没有声音后进入挂起状态,这个是正常的。但是下次播放它又会进入到running状态。可以试试用系统音乐播放器,这个因为接口特性不会在暂停播放时进入suspend

问题是不会running啊,现在只能每次跑脚本唤醒joy

HDMI也一样的。

Reply View the author
avatar
qq4945286
deepin
2026-09-11 19:20
#9
剑风澜:

问题是不会running啊,现在只能每次跑脚本唤醒joy

HDMI也一样的。

我也是,只要没有声音了就运行脚本,暂时也只能这样。

Reply View the author
avatar
剑风澜
deepin
2026-09-11 21:38
#10
qq4945286:

我也是,只要没有声音了就运行脚本,暂时也只能这样。

sweat

Reply View the author