使用 root 时 Raspbian 没有声音

问题描述 投票:0回答:3

我的 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)
python raspberry-pi pygame raspberry-pi3 raspbian
3个回答
1
投票

花了将近一天的时间尝试在使用 root 用户时启用模拟输出。

首先确保默认用户(pi)有音频:

aplay sound.wav

如果有效,则将音频配置复制到 root 用户主目录,尝试以下操作:

sudo su
cd
cp /home/pi/.asoundrc .asoundrc
reboot

0
投票

您使用的是 3.5 毫米插孔还是 HDMI? 我过去注意到的一件事是,如果我将

alsamixer
运行为
user=pi
,默认设备是 3.5 毫米辅助插孔。但是,如果我运行
sudo alsamixer
,默认设备现在是 HDMI。从来没有想过为什么,只知道这是一件事。


0
投票

我发现强制树莓派的

root
用户播放音频非常困难。我需要这样做是因为我想在启动时运行一个 python 程序,它通过 python Playsound 模块播放音频。

我发现你需要做两件事才能让 root 用户播放音频:

  1. 使用
    sudo -u
    命令以普通用户身份运行命令,即
    sudo -u pi
  2. 为该用户正确设置 XDG_RUNTIME_DIR 环境变量,即
    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
© www.soinside.com 2019 - 2024. All rights reserved.