python-3.x - 如何使用 systemd 服务显示 PyGame 帧缓冲区?

标签 python-3.x pygame raspberry-pi3 systemd

我创建了一个流光溢彩克隆作为个人学习项目。它使用USB网络摄像头从电视捕获所需的RGB数据;它目前功能齐全。我的问题是我的 RasPi 目前是 headless 的,我希望能够在 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()

我对Linux不是很有经验,但我的理解是从systemd运行时没有fb0?我知道服务通常用于在后台运行的东西。但这是一个特殊情况。我想在设备打开时自动启动该服务。理想情况下,我永远不需要使用 SSH 登录设备。

根据 StackOverflow 上的另一个问题/答案,我在 .service 文件中尝试了此代码。

Environment="DISPLAY=:0"
Environment="XAUTHORITY=/home/pi/.Xauthority"

这没有帮助,我认为这是因为我没有显示器。 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

注意!当 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)

关于python-3.x - 如何使用 systemd 服务显示 PyGame 帧缓冲区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57205271/

相关文章:

python - 如何在 ‘\n’ 上拆分一行并将拆分后的所有内容添加到新行?

python - 如何修改 pandas df 以调整系列情节的起点?

python - 代码调试,为什么运行后LED不灭?

python - 列表理解是否允许多个 elif 语句?

python - 使用实时视频源监视Python中的模拟量规

pygame - 为什么 pyglet 比 pygame 慢?

Python VLC 不会播放音频?

python - 有没有办法更改 my_sprite 或 my_group 来更改显示的动画?

bluetooth - 如何设置 Bluez 5 以在配对期间询问密码

python - 对视频文件中每个蒙版帧进行 'White'像素计数