我正在编写一个利用 Raspberry PI 的 GPIO 的 python 脚本,因此必须将脚本提升为 sudo 运行,以获得 /dev/mem 和 /dev/gpiomem 的正确权限并访问 GPIO。
不过我也想从这个脚本中播放声音,所以我现在使用os.system(cmd)
允许 Python 执行 shell 命令的方法。
我正在使用这种方法将 wav 文件加载到 aplay 中。
Python 片段:
defaultUser = 'pi' #the user to run the command as
cmd = 'sudo -H -u %s bash -c \'aplay sounds/%s &\'' % (defaultUser, filename)
os.system(cmd) #now run the command as if it were typed into the shell
上面的尝试以默认用户身份启动命令,当我自己使用 alsa 时,这曾经工作得很好。然而,由于 DAC 打开和关闭时发出的爆裂声/爆裂声,我不得不切换到脉冲音频并禁用空闲时模块挂起。
这导致了上述问题,我不再能够从 root 用户发出声音。
我尝试在 shell 中执行这些命令,尝试以默认用户身份启动 aplay(但实际上没有一个播放任何声音):
$ sudo -H -u pi bash -c 'aplay sounds/beep.wav &'
$ Playing WAVE 'sounds/3tone.wav' : Signed 16 bit Little Endian, Rate 44100 Hz, Mono
和
$ sudo -u pi aplay sounds/beep.wav
$ Playing WAVE 'sounds/beep.wav' : Signed 16 bit Little Endian, Rate 44100 Hz, Mono
两者都产生良好的详细输出,只是没有音频。
如果我以非 root 用户(又名 pi)身份运行,我确实会收到音频
什么可能导致pulseaudio或aplay对非root用户起作用,但当root启动命令以默认用户身份运行时却不起作用?
这让我陷入了第 22 条军规,我需要 sudo,但 sudo 会导致问题。
感谢您的指导!
答案1
Pulseaudio 的设计仅适用于登录用户。
你要么需要全系统 Pulseaudio,或者您必须启用非默认选项之一通讯方式模块为根。