我的 Raspberry 遇到了一个非常奇怪的问题。我需要用它播放声音,并且需要在需要 sudo 才能工作的脚本内执行此操作。但是,由于某种原因,当我尝试使用 sudo 播放声音时,它不起作用。 没有错误,它只是不发出任何声音(我尝试了几个库,但没有一个有效)。如果我使用 omxplayer,它确实有效。 如果我不使用 sudo,一切都会正常。 有人遇到类似问题吗
编辑:我添加了我使用的代码之一(这在另一个树莓派上运行得很好)
import pygame
import time
pygame.mixer.init()
pygame.mixer.music.stop()
pygame.mixer.music.load("music.mp3")
pygame.mixer.music.play()
print("Going forward")
while True:
time.sleep(1)
花了将近一天的时间尝试在使用 root 用户时启用模拟输出。
首先确保默认用户(pi)有音频:
aplay sound.wav
如果有效,则将音频配置复制到 root 用户主目录,尝试以下操作:
sudo su
cd
cp /home/pi/.asoundrc .asoundrc
reboot
您使用的是 3.5 毫米插孔还是 HDMI? 我过去注意到的一件事是,如果我将
alsamixer
运行为 user=pi
,默认设备是 3.5 毫米辅助插孔。但是,如果我运行 sudo alsamixer
,默认设备现在是 HDMI。从来没有想过为什么,只知道这是一件事。
我发现强制树莓派的
root
用户播放音频非常困难。我需要这样做是因为我想在启动时运行一个 python 程序,它通过 python Playsound 模块播放音频。
我发现你需要做两件事才能让 root 用户播放音频:
sudo -u
命令以普通用户身份运行命令,即 sudo -u pi
。XDG_RUNTIME_DIR=/run/user/1000
。具体操作方法如下。
首先,在常规用户 shell 中,发现
XDG_RUNTIME_DIR
变量的正确值是什么。
$ echo $XDG_RUNTIME_DIR
对我来说,我得到了输出:
/run/user/1000
我们将在调用脚本之前正确设置该值。
$ sudo -u pi bash -c "XDG_RUNTIME_DIR=/run/user/1000 python3 /home/pi/myscript.py"
注意,您需要将
/run/user/1000
替换为适合您情况的正确值。
如果您需要使用由
venv
或 virtualenv
创建的虚拟环境,您可以使用以下命令使用正确的虚拟环境调用脚本,(假设您的虚拟环境文件夹位于 /home/pi/my -路径/venv):
$ sudo -u pi bash -c "XDG_RUNTIME_DIR=/run/user/1000 /home/pi/my-path-to/venv/bin/python3 /home/pi/myscript.py"
如果你想在启动时运行 python 脚本,我发现你可以使用 cronjob。
运行
crontab -e
:
$ crontab -e
(系统可能会提示您选择终端编辑器)。
然后将以下行添加到文件中,然后保存:
@reboot XDG_RUNTIME_DIR=/run/user/1000 python3 /home/pi/myscript.py