【发布时间】:2019-11-20 22:17:37
【问题描述】:
在我的程序中,我正在将菜单直接写入 Raspberry Pi 上的帧缓冲区。这个程序可以用omxplayer播放视频,并调用另一个程序用omxiv显示jpeg-pictures。如果 omxplayer 在 omxiv 之前运行,菜单会在之后变得不可见,并且在我再次使用 omxplayer 播放视频之前,我无法再次写入帧缓冲区。重启程序没有任何帮助。
这里显示了一个简单的示例。该程序在绿色背景上绘制一个蓝色矩形,播放一个宽屏,然后显示一个图像。我原以为最后会绘制一个蓝色矩形,但它并没有发生。下次运行程序时,矩形是不可见的。如果我在 omxiv 之后播放视频,一切正常。
用户 pi 是否失去了写入帧缓冲区的权限?
#!/usr/bin/env python
import numpy as np
from PIL import Image
import time, subprocess, os
fb = np.memmap('/dev/fb0', dtype='uint8',mode='w+', shape=(1024,1280,4))
fb[:] = [0,255,0,255]
x0, y0 = 50, 100
w, h = 300, 200
img = Image.new('RGBA', size=(w, h), color=(255,0,0,255))
n = np.array(img)
fb[y0:y0+h, x0:x0+w] = n
time.sleep(2)
os.system('omxplayer -b -r -o both video.mp4')
time.sleep(2)
subprocess.Popen('omxiv 0.jpg >/dev/null 2>&1', shell = True)
time.sleep(2)
subprocess.Popen('pkill omxiv >/dev/null 2>&1',shell = True)
time.sleep(2)
fb[y0:y0+h, x0:x0+w] = n
【问题讨论】:
-
我不明白。你说你的程序在
omxiv运行之后无法写入帧缓冲区,但你的程序甚至在omxiv之后都没有尝试写入帧缓冲区,它这样做之前omxiv跑了吗? -
重启后第一次运行程序时,我可以看到矩形后面跟着 jpg 图像。如果我再次启动程序,recyangle 不可见,而只有 jpg 图像。在启动程序之前我必须重新启动才能再次看到矩形。
-
尝试使用比 SIGTERM 更强的信号,也许是 SIGKILL (9)。尝试运行
lsof以查看omxiv是否仍然保持帧缓冲设备打开。 -
pkill -9 omxiv 没有帮助,并且 lsof 没有列出任何关于 omxiv 或 fb0 的信息。
标签: python numpy raspberry-pi framebuffer omxplayer