Pah*_*uri 2 pygame python-3.x systemd raspberry-pi3
我创建了一个流光溢彩的克隆作为个人学习项目。它使用USB网络摄像头从电视捕获所需的RGB数据;它目前功能齐全。我的问题是我的 RasPi 目前是无头的,我希望能够在 HDMI 输出上显示内容;例如,用 RGB(0,255,0) 填充屏幕,用于从网络摄像头图像中查找电视屏幕。
目前,我正在使用一个名为 Hdmi 的类。它使用 PyGame surfarray 允许在帧缓冲区上显示 NumPy 数组。当使用“sudo $(which python) webcambilight.py”运行代码时,这工作得很好。但使用系统时,明显没有界面。它不会给出任何错误;它只是停止运行。如果我删除 Hdmi 类,一切正常。
这将问题缩小到这段代码:
os.putenv('SDL_FBDEV', '/dev/fb0')
os.putenv('SDL_VIDEODRIVER', 'fbcon')
pygame.display.init()
Run Code Online (Sandbox Code Playgroud)
我对Linux不是很有经验,但我的理解是从systemd运行时没有fb0?我知道服务通常是在后台运行的。但这是一个特殊情况。我想在设备打开时自动启动该服务。理想情况下,我永远不需要使用 SSH 登录设备。
根据 StackOverflow 上的另一个问题/答案,我在 .service 文件中尝试了此代码。
Environment="DISPLAY=:0"
Environment="XAUTHORITY=/home/pi/.Xauthority"
Run Code Online (Sandbox Code Playgroud)
这没有帮助,我认为这是因为我没有显示器。fb0 和 fbcon 并没有真正显示在 display=:0 上,对吗?
我的 .service 文件的内容当前为:
[Unit]
Description=Webcambilight
After=network.target
[Service]
Type=idle
WorkingDirectory=/home/pi/webcambilight
ExecStart=/home/pi/.virtualenvs/py3cv4/bin/python -u webcambilight.py
[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)
笔记!当 Hdmi 未使用时,此功能正常工作。但我很想用它。现在,如果我不小心移动了网络摄像头或电视,我将不得不使用电视打开 YouTube 并播放绿屏视频,然后按下树莓派上的校准按钮(这是一个 GPIO 按钮)。
我想要做的是将输入更改为连接到 RasPi 的 HDMI 4。然后,通过按下 GPIO 校准按钮,我的 Hdmi 类将用 (0,255,0) 填充整个 1920x1080 帧缓冲区。
Sooo..关于在运行 systemd 服务时访问帧缓冲区(/dev/fb0?)有什么想法吗?
Hdmi类的完整代码位于:https://github.com/sourander/webcambilight/blob/master/wambilight/hdmi.py
显然,这解决了它。systemd 发送挂断信号的原因超出了我对 Linux 的了解。
import signal
def handler(signum, frame):
pass
signal.signal(signal.SIGHUP, handler)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
981 次 |
| 最近记录: |