我创建了一个流光溢彩克隆作为个人学习项目。它使用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/