Pyglet在终端播放音频报错GStreamer-CRITICAL,Sublime中运行正常如何解决?
问题原因
- pyglet音频播放依赖自身的事件循环维持进程存活。Sublime Text执行代码时会默认保持进程后台驻留,音频解码输出逻辑可以完整执行;终端执行时原代码发送play指令后主进程会立刻终止,音频还没开始输出就被销毁。wav格式无报错是因为无压缩音频资源加载速度更快,进程退出时没有触发GStreamer的资源校验错误,mp3需要GStreamer动态解码,进程异常退出时就会抛出
Bus bus 1 has no signal watches attached的临界错误。 - 终端会话的GStreamer环境与Sublime Text继承的桌面环境会话存在差异。Sublime Text启动时会加载完整的音频服务变量、GStreamer插件路径,部分终端会话(比如SSH远程终端、非桌面登陆的tty终端)可能无法识别当前系统的音频输出组件,导致音频静默无输出。
解决方案
- 给代码补充事件循环逻辑,保证音频播放完成前进程不退出,修改后代码如下:
import pyglet source = pyglet.media.load("my_track.mp3") player = source.play() # 监听播放结束事件,播放完成后退出事件循环 def on_play_end(): pyglet.app.exit() player.push_handlers(on_eos=on_play_end) # 启动pyglet事件循环 pyglet.app.run()
- 安装完整的GStreamer解码插件集,对应系统安装命令如下:
Debian/Ubuntu 系列:sudo apt install gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav
Fedora/CentOS 系列:sudo dnf install gstreamer1 gstreamer1-plugins-base gstreamer1-plugins-good gstreamer1-plugins-bad-free gstreamer1-plugins-ugly gstreamer1-libav - 显式指定pyglet的音频输出驱动,在代码最开头添加配置:
import pyglet # 优先使用PulseAudio、ALSA驱动,避免匹配到无效输出 pyglet.options['audio'] = ('pulse', 'alsa', 'silent')
- 不要在无音频服务的远程SSH终端、纯字符tty终端直接运行代码,需要在桌面环境的终端模拟器中执行,保证当前会话可以访问系统音频服务。
内容的提问来源于stack exchange,提问作者fefta
相关产品推荐
相关产品推荐

