Pygame 音频将无法正常启动,除非 运行 作为 root

Pygame audio won't start properly unless run as root

所以我正在开发一个 运行 的闹钟项目,作为 homebridge 自动化项目的一部分,我正在编写 python 脚本来发出实际的声音警报。该脚本将由 homebridge 启动,然后将处理所有播放声音和打瞌睡等。基本上我现在所做的就是播放声音。我已经编写了以下使用 pygame 作为音频播放器的简单脚本,以便我未来的状态机可以负责监视贪睡按钮等。

import pygame
import time

files = ['s1.mp3']

pygame.mixer.init()
pygame.init()






stepper = 0
#file loading
while stepper < len(files):
    pygame.mixer.music.load(files[stepper])
    print("Playing:",files[stepper])
    stepper += 1
    pygame.mixer.music.play()
#play and pause
    while pygame.mixer.music.get_busy():
        timer = pygame.mixer.music.get_pos()
        time.sleep(1)
        control = input("enter control: ")
        pygame.time.Clock().tick(10)
        if control == "pause":
            pygame.mixer.music.pause()
        elif control == "play" :
            pygame.mixer.music.unpause()
        elif control == "time":
            timer = pygame.mixer.music.get_pos()
            timer = timer/1000
            print (str(timer))
        elif control == "exit":
            print ("True")
            pygame.mixer.music.stop()
            break
        else:
            continue

当我在 windows 上 运行 时,效果很好。我能够播放、暂停、检查时间,最重要的是,我真的能听到声音。但是,当我将其移至我的 raspberry pi 时,它会死掉,但前提是它是由普通用户启动的,在这种情况下,它会给出此错误

Hello from the pygame community. https://www.pygame.org/contribute.html
ALSA lib confmisc.c:767:(parse_card) cannot find card '0'
ALSA lib conf.c:4568:(_snd_config_evaluate) function snd_func_card_driver returned error: No such file or directory
ALSA lib confmisc.c:392:(snd_func_concat) error evaluating strings
ALSA lib conf.c:4568:(_snd_config_evaluate) function snd_func_concat returned error: No such file or directory
ALSA lib confmisc.c:1246:(snd_func_refer) error evaluating name
ALSA lib conf.c:4568:(_snd_config_evaluate) function snd_func_refer returned error: No such file or directory
ALSA lib conf.c:5047:(snd_config_expand) Evaluate error: No such file or directory
ALSA lib pcm.c:2565:(snd_pcm_open_noupdate) Unknown PCM default
Traceback (most recent call last):
  File "musictest.py", line 6, in <module>
    pygame.mixer.init()
pygame.error: No available audio device

如果我 运行 它是 root,即 sudo python ./musicTest.py 我没有问题并且声音播放。我宁愿不必 运行 这个脚本作为 root,我也不认为它真的需要。也许我在这里遗漏了一些东西,这实际上是必要的,但我很乐意帮助理解它。

到目前为止,我已尝试更新所有驱动程序和软件包以查看是否修复了它。一旦我意识到它以 root 用户身份工作,我就停止尝试了,这意味着该软件可以正常工作,只是存在某种权限问题。我能够从 HDMI 和耳机端口播放音频。这不是音量问题,因为它也可以作为 root 使用。

我也尝试了 this 页面,但这也没有解决问题。如果有人有任何想法,我愿意接受所有建议,或解释为什么我必须使用 sudo :) 谢谢!

P.S。我正在使用今天安装的 raspbain lite 的新映像,运行ning 在 raspberry pi 2 B+ 上,我使用的是 python 3.7.3 和 pygame 1。 9.something,好像找不到确切的数字。

所以我做了更多的修补工作,发现问题只发生在我的用户在控制台上登录时。我试图通过 SSH 播放音乐,或者更确切地说,通过 ssh 启动脚本。事实证明,解决方法是将用户添加到音频组,授予他们使用音频驱动程序的权限,即使他们未登录也是如此。这可以通过命令 sudo adduser $USER audio 完成。但是,我将 $USER 替换为我的用户 (cbearda3)。我在另一个 stack overflow post 上发现了这个,一旦我意识到这个问题只是在 ssh 上。这是我的解决方案,虽然我意识到我的用例非常具体,但我想我会为以后遇到此问题的任何人记录下来。