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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 00:06:03