我正在尝试通过 SSH 在我的 Raspberry Pi 上运行音频可视化 Python 脚本。该脚本使用 pyaudio 作为麦克风输入,据我所知,它在后台使用 pulseaudio。该脚本还使用 Adafruit 库来控制一些 NeoPixel LED,这必须以 root 身份运行。
我了解到默认情况下 pulseaudio 不以 root 身份运行,而必须以用户身份运行。我通过创建一个简单的 python 脚本 (throughput.py) 来列出 pyaudio 设备来验证这一点。当我运行没有sudo 我看到 3 个设备,包括脉冲:
pi@raspberrypi:~/audio-reactive-led-strip/python $ python3 throughput.py
Input Device id 1 - Antlion USB adapter: Audio (hw:1,0)
Input Device id 2 - pulse
Input Device id 6 - default
但是,当我以 sudo 身份运行它时,我只看到一个设备和脉冲不见了:
pi@raspberrypi:~/audio-reactive-led-strip/python $ sudo python3 throughput.py
Input Device id 1 - Antlion USB adapter: Audio (hw:1,0)
虽然显然不推荐,但我修改了/etc/systemd/system/pulseaudio.service
以下内容这个帖子以便将 pulseaudio 服务作为系统服务运行。(我不清楚这是否与以 root 身份运行它相同。):
[Unit]
Description=Pulseaudio sound server
After=avahi-daemon.service network.target
[Service]
ExecStart=/usr/bin/pulseaudio --system --disallow-exit --disallow-module-loading
ExecReload=/bin/kill -HUP $MAINPID
[Install]
WantedBy=multi-user.target
有了这个,以 sudo 身份运行时,所有 3 个设备都会列出(包括 pulse),我就可以运行我的可视化脚本了在 pi 上本地。
但是,如果我通过 SSH 进入 pi 并运行完全相同的命令(作为 sudo),它找不到 pulseaudio 设备 - 与我在修改之前在本地执行的操作相同pulseaudio.service
。我猜想本地 sudo 和通过 SSH 的权限略有不同,但我对 linux 还不是很熟悉,并没有找到任何可以表明这是真的或如何解决它的东西。
我不知道这是否相关,但我正在使用 VS Code Remote-SSH 内部的终端来处理 SSH 部分。
更新 1
根据以下答案,我尝试使用带有 X11 转发的 Putty。但是,运行时出现以下错误start-pulseaudio-x11
:
pi@raspberrypi:~/audio-reactive-led-strip/python $ start-pulseaudio-x11
PuTTY X11 proxy: unable to connect to forwarded X server: Network error: Connection refused
xcb_connection_has_error() returned true
Failure: Module initialization failed
PuTTY X11 proxy: Unsupported authorisation protocol
xcb_connection_has_error() returned true
ALSA lib pulse.c:243:(pulse_connect) PulseAudio: Unable to connect: Connection refused
有人知道如何解决这个问题吗?
更新2
将文件.Xauthority
从复制/home/pi
到/root
参见此帖sudo python3 throughput.py
,当我在启用 X11 转发的情况下从 Putty运行时,我能够成功看到所有 3 个适配器,并且西明跑步!
但是,这个文件似乎.Xauthority
只适用于一个 SSH 会话。我思考我每次都可以使用sudo
Putty 复制它,但我还没有尝试过。我必须阅读.Xauthority
文件的工作原理,以了解发生了什么,并且非常感谢大家的任何见解!
答案1
我使用 Adafruit 库控制 NeoPixel LED 和使用 pulseaudio 用 python 录制音频数据时遇到了完全相同的问题。一切正常本地,但在尝试运行脚本时输出以下错误代码通过 SSH:
XDG_RUNTIME_DIR (/run/user/1000) is not owned by us
(uid 0), but by uid 1000! (This could e g happen if
you try to connect to a non-root PulseAudio as a
root user, over the native protocol. Don't do that.)
在搜索过程中,我偶然发现了以下命令
start-pulseaudio-x11
这解决了我的问题(我已经在 RasPi 和我的 PuTTY SSH 会话上激活了 X11 转发以显示文件对话框)。
答案2
正确的方法可能是找出 LED 的设备节点并授予setfacl
用户操作它的权限。