如何解决Pygame将不会播放音频,而只会在作为守护程序运行时播放
背景知识:我有一个运行Raspbian(Debian)9.11的Raspberry Pi 3b。原始的Pi运行Python 3脚本,该脚本捕获来自手持式扫描仪的文本输入并将其发送到MySQL数据库,然后播放wav文件,以便扫描的员工知道此操作成功。我将其守护进程化,以便更轻松地重新启动(有时扫描仪会与其USB加密狗失去同步)。守护程序文件中的主行是
ExecStart=/usr/bin/python3 /home/pi/Desktop/scanner.py
我不得不为创建一个新实例而稍稍更改流程,因此我将Raspbian 10.4(最新版)加载到另一个Pi 3b上,然后进行了一点微调,然后将其插入到本地Maria DB中,从而完成了所有操作(基本上是MySQL)。守护程序运行得很好...除了不播放音频(但仍会插入数据库)。真正奇怪的是,当我将其加载到Thonny中时,它可以正常播放文件。系统日志中没有任何内容表明Python或Pygame正在生成任何错误。
这里的相关代码(缩写)是
import pygame.mixer
# sets up sound
pygame.mixer.init()
goodscan = pygame.mixer.Sound('/home/pi/Desktop/goodscan.wav')
duplicatescan = pygame.mixer.Sound('/home/pi/Desktop/duplicateScan.wav')
badscan = pygame.mixer.Sound('/home/pi/Desktop/badScan.wav')
#function that the USB listener calls
def scan(scanner):
#some scanner processing codes here
if prevScan == x:
duplicatescan.play()
print("Duplicate Scan")
continue;
else:
splits = x.split('-')
if(len(splits) < 3):
print("No prefix provided")
#write to error log
badscan.play();
continue;
prefix = splits[0][0] + splits[0][1]
po = splits[1] + '-' + splits[2]
scanner_number = splits[0][2] + splits[0][3]
polist.extend([po,prefixes[prefix],scanner_number])
goodscan.play()
#DB insert (this always works)
scans = {
"timestamp": time_str,"ponum": x,"status": polist[1],"scanner": polist[2]
}
statusUpdate.databaseUpdate(polist)
如何调试为什么它在守护程序模式下不起作用?
解决方法
我猜想这与从Raspberry Pi OS到Linux内核5.4的转变有关(较早的Pi正在运行4.19内核)。我使用pip升级到Pygame 1.9.6,在停止或重新启动服务时,此错误已添加到系统日志中
9月3日08:40:46 raspberrypi内核:[164439.999815] bcm2835_audio bcm2835_audio:无法关闭VCHI服务连接(状态= 1)
Kingsley在评论中询问该用户在哪个用户下运行,答案是root(我从未在系统服务文件中指定用户)。但是,我注意到Thonny在“ pi”用户下运行。我认为可以尝试一下,所以我添加了
User=pi
到我的服务文件,现在Pygame音频在该服务中再次起作用。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。