python - 连续处理opencv帧并使用gstreamer rtsp按需显示
问题描述
我正在尝试编写一个 python 脚本,该脚本可以连续处理来自相机的图像,并在有连接的情况下通过 gstreamer rtsp 显示图像。虽然有类似的帖子,我可以通过 rtsp 显示相机视频,但视频捕获机制仅在GstRtspServer.RTSPMediaFactory.on_need_data()
方法运行时运行
理想情况下,我希望有一个SensorFactory
继承RTSPMediaFactory
类的类和捕获图像、处理它们并设置的 while 循环SensorFactory.frame
。SensorFactory.on_need_data
将返回最新SensorFactory.frame
class SensorFactory(GstRtspServer.RTSPMediaFactory):
def __init__(self, **properties):
GstRtspServer.RTSPMediaFactory.__init__(self)
self.frame = None
...
def on_need_data(self, src, lenght):
if self.frame is not None:
data = self.frame.tostring()
buf = Gst.Buffer.new_allocate(None, len(data), None)
buf.fill(0, data)
buf.duration = self.duration
timestamp = self.number_frames * self.duration
buf.pts = buf.dts = int(timestamp)
buf.offset = timestamp
self.number_frames += 1
retval = src.emit('push-buffer', buf)
GObject.threads_init()
Gst.init(None)
server = GstServer()
loop = GObject.MainLoop()
loop.run()
cap = cv2.VideoCapture(0)
while(True):
ret, frame = cap.read()
server.frame = frame
process(frame)
问题是这段代码停留在loop.run()
. 虽然我可以在 中读取帧on_need_data()
,但这只会在有活动的 rtsp 连接时处理视频,即使没有活动的 rtsp 连接,我也想处理帧。
我尝试threading.Event
了各种loop.get_context()
方法,但我不确定如何将它们集成到这个场景中。
解决方案
推荐阅读
- html - res.sendFile 不呈现 html
- python - Python/Plotly:如何使用要显示的信息自定义悬停模板?
- vim - 如何检测是否安装了电力线?
- angular - 在异步管道中设置变量名
- flutter - Flutter 移除 Navigator.push 上的底部导航栏
- ruby-on-rails - 如何使用 devise-token_authenticable gem 访问 current_user?
- javascript - 检查 JSON 对象是否符合预期模式的最轻量级方法是什么?
- ios - 正确配置闭包以捕获结果
- docker - 您如何引用 aws secrets manager 机密“值”,并将其应用于代码构建 buildspec 命令?
- php - 树枝模板返回 html 字符