You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu22下systemd运行PyGame Mixer脚本遇ALSA欠载问题

问题解决:Systemd运行PyGame音频脚本出现ALSA Underrun错误

核心原因

你遇到的问题确实和桌面系统的音频会话有关:

  • 手动运行脚本时,你处于桌面用户会话中,PulseAudio已作为用户级守护进程运行,PyGame可以通过PulseAudio正常访问音频设备。
  • 而systemd的multi-user.target或CRON运行的脚本,处于无桌面的系统会话,无法接入用户的PulseAudio会话,PyGame尝试直接用ALSA访问声卡时,会被桌面会话中正在运行的PulseAudio占用,从而触发underrun错误。

解决方案

1. 修改Systemd服务配置,接入桌面会话

将服务绑定到桌面启动目标,并继承用户的桌面环境变量:

[Unit]
Description=Audio Server
After=graphical.target pulseaudio.service

[Service]
Restart=on-failure
WorkingDirectory=/home/user/audio
# 继承桌面会话的显示和认证信息
Environment=DISPLAY=:0
Environment=XAUTHORITY=/home/user/.Xauthority
ExecStart=/usr/bin/python3 -u /home/user/audio/soundServer.py
User=user
Type=simple

[Install]
WantedBy=graphical.target
  • graphical.target确保服务在桌面完全启动后运行,替代原来的multi-user.target
  • DISPLAY和XAUTHORITY环境变量让服务能访问用户的桌面会话资源,包括PulseAudio

2. 强制PyGame使用PulseAudio驱动

在Python脚本开头添加环境变量设置,让PyGame Mixer优先通过PulseAudio播放:

import os
# 指定PulseAudio作为音频驱动
os.environ['SDL_AUDIODRIVER'] = 'pulse'
import pygame

pygame.mixer.init()
# 你的音频播放代码...

这样可以避免PyGame直接调用ALSA,而是通过PulseAudio的用户会话来处理音频,彻底解决设备占用冲突。

3. 验证配置

修改后重新加载服务并启动:

sudo systemctl daemon-reload
sudo systemctl enable --now audio-server.service

查看服务状态和日志确认是否正常:

systemctl status audio-server.service
journalctl -u audio-server.service -f

额外说明

  • 不需要ExecStartPre=/bin/sleep 5,After=graphical.target已经能确保依赖服务启动完成
  • 修改/etc/pulse/daemon.conf的参数对用户会话生效,但系统级服务无法直接受益,因此不是有效解决方案

内容的提问来源于stack exchange,提问作者Razvan Levarda

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 05:42:48