Ubuntu 20.04下Pygame/Pyglet直接调用ALSA致多音频播放失败
Ubuntu 20.04.5 LTS下Pygame/Pyglet无法与其他音频源同时播放的问题
我使用Ubuntu 20.04.5 LTS系统,单独运行Pygame或Pyglet播放音频时一切正常,但当系统有其他音频源正在播放时就会报错。
Pygame相关情况
代码示例:
from pygame import mixer mixer.init() mixer.music.load("path_to_file.wav") mixer.music.play()
报错信息:
pygame.error: ALSA: Couldn't open audio device: Device or resource busy
看起来Pygame直接调用ALSA,导致无法同时播放多音频。
Pyglet相关情况
代码示例:
import pyglet pyglet.options['audio'] = ('openal', 'pulse', 'directsound', 'silent') pyglet.media.load("path_to_file.wav", streaming=True).play()
单独运行正常,但有其他音频源时报错:
AttributeError: 'OpenALDriver' object has no attribute 'worker'
已尝试的解决操作
核心问题似乎是这些程序直接调用ALSA,我已安装pulseaudio和openal,但无法正常使用。后来尝试通过环境变量指定Pygame使用PulseAudio驱动:
from os import environ environ["SDL_AUDIODRIVER"] = "pulseaudio"
但报错:
pygame.error: Could not setup connection to PulseAudio
怀疑系统缺少某些组件,但不知道具体是什么。
解决方案
1. 修复Pygame的PulseAudio连接问题
- 先确保PulseAudio服务正常运行:
systemctl --user restart pulseaudio - 安装SDL与PulseAudio相关依赖:
sudo apt install libsdl2-mixer-2.0-0 libsdl2-mixer-dev libpulse-dev - 重新安装带PulseAudio支持的Pygame:
pip uninstall pygame pip install pygame --no-binary pygame - 调整代码中环境变量的位置(必须放在
mixer.init()之前):from os import environ environ["SDL_AUDIODRIVER"] = "pulseaudio" from pygame import mixer mixer.init() mixer.music.load("path_to_file.wav") mixer.music.play()
2. 调整Pyglet的音频驱动优先级
- 把PulseAudio放在驱动列表最前面,避免OpenAL抢占设备:
import pyglet pyglet.options['audio'] = ('pulse', 'openal', 'directsound', 'silent') player = pyglet.media.load("path_to_file.wav", streaming=True).play() pyglet.app.run() - 升级Pyglet并安装依赖:
sudo apt install libpulse-dev pip install pyglet --upgrade
3. 配置ALSA通过PulseAudio转发
新建或编辑~/.asoundrc文件,添加以下内容:
pcm.!default { type pulse } ctl.!default { type pulse }
这样所有调用ALSA的程序都会通过PulseAudio处理,实现多音频同时播放。
内容的提问来源于stack exchange,提问作者user20061243
相关产品推荐
相关产品推荐

