首页 > 解决方案 > 连续处理opencv帧并使用gstreamer rtsp按需显示

问题描述

我正在尝试编写一个 python 脚本,该脚本可以连续处理来自相机的图像,并在有连接的情况下通过 gstreamer rtsp 显示图像。虽然有类似的帖子,我可以通过 rtsp 显示相机视频,但视频捕获机制仅在GstRtspServer.RTSPMediaFactory.on_need_data()方法运行时运行

理想情况下,我希望有一个SensorFactory继承RTSPMediaFactory类的类和捕获图像、处理它们并设置的 while 循环SensorFactory.frameSensorFactory.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()方法,但我不确定如何将它们集成到这个场景中。

标签: pythonmultithreadingopencvgstreamer

解决方案


推荐阅读