pygame.error:>使用pulseaudio

时间:2018-03-01 22:20:55

标签: python pygame alsa pulseaudio

我想在systemd中运行pygame mixer,我以此代码为例:

from pygame import mixer
import signal,sys,time
def signal_handler(signal,frame):
    global inter
    inter=True
    sys.exit(0)

signal.signal(signal.SIGINT, signal_handler)


def play_audio_file(fname):
    if mixer.get_init() != None:
        mixer.quit()
    mixer.init()
    mixer.Sound(fname).play()



while True:
    play_audio_file('/home/mohammad/tmp/ding.wav')
    time.sleep(0.5)

以及以下systemd服务文件:

[Unit]
Description=pygame mixer test
Wants=network-online.target
After=network-online.target

[Service]
Environment=VIRTUAL_ENV=/home/mohammad/env
Environment=PATH=/home/mohammad/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
ExecStart=/usr/bin/python /home/mohammad/tmp/service.py

WorkingDirectory=/home/mohammad/
StandardOutput=inherit
StandardError=inherit
Restart=always
User=mohammad    
[Install]
WantedBy=multi-user.target

当我在没有其他程序的情况下启动服务时,脚本按预期工作(wav文件重复播放)但是当我启动一个输出声音然后启动服务的程序时,我收到此错误:

  

Mar 02 01:12:04 mohammad-pc python [3415]:ALSA lib   pcm_dmix.c:1099:(snd_pcm_dmix_open)无法打开奴隶Mar 02   01:12:04 mohammad-pc python [3415]:Traceback(最近一次调用最后一次):   3月02日01:12:04 mohammad-pc python [3415]:文件   “/home/mohammad/tmp/service.py”,第20行,3月02日01:12:04   mohammad-pc python [3415]:
  play_audio_file('/ home / mohammad / tmp / ding.wav')Mar 02 01:12:04   mohammad-pc python [3415]:文件“/home/mohammad/tmp/service.py”,行   14,在play_audio_file Mar 02 01:12:04 mohammad-pc python [3415]:
  mixer.init()Mar 02 01:12:04 mohammad-pc python [3415]:pygame.error:   没有可用的音频设备

这个问题只出现在运行pulseaudio的manjaro linux机器上,但是当我在我的raspberrypi(raspbian strech)中运行相同的代码时,只运行alsa而没有pulseaudio,那么问题就解决了。

我能够通过在服务文件中传递DISPLAY和Home环境变量来解决问题(当然是在我的manjaro机器上):

[Unit]
Description=pygame mixer test
Wants=network-online.target
After=network-online.target

[Service]
Environment=VIRTUAL_ENV=/home/mohammad/env
Environment=PATH=/home/mohammad/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
ExecStart=/usr/bin/python /home/mohammad/tmp/service.py
Environment=DISPLAY=:0
Environment=HOME=/home/mohammad
WorkingDirectory=/home/mohammad/
StandardOutput=inherit
StandardError=inherit
Restart=always
User=mohammad

[Install]
WantedBy=multi-user.target

但我想理解为什么pygame需要这些变量,这可以避免吗?

更新1:

当我在我的主项目中包含pygame时(除了上面的示例代码)我还需要包含Environment=XDG_RUNTIME_DIR=/run/user/1000才能使其正常工作

0 个答案:

没有答案