0

在此链接中,我们可以访问 gstreamer 管道缓冲区并转换 numpy 数组中的帧缓冲区,我想知道,我如何访问 GPU 内存中的帧缓冲区,然后输入我的自定义处理器而不将帧转换为 numpy 数组。

我们有两种使用 deepstream 解码器的解决方案(比 opencv+gstreamer 更有效的方式):一种是我们需要编写处理的自定义元素并在 gstreamer 中注册,然后将自定义元素放入管道中,然后对帧缓冲区进行处理. 这种方式很好但需要编写和了解gstreamer编程。这种方式与深流相同。第二种方法是我们只使用来自该链接的帧解码,然后将帧传递到自定义处理器单元。对于这一部分,我有两个问题:

1- gstreamer 的循环与异步编程循环相同吗?

2-如您所知,如果我们在 pad prob 函数中添加额外的操作,这会导致性能下降,但我想知道,是否可以将帧放在 pad prob 函数中并执行loop.create_task(process(frame))像异步?这导致我们在这里不等待执行处理。像这样:

def tiler_sink_pad_buffer_probe(pad,info,u_data):
    ....
    ### capture the frames in GPU buffer without converting into numpy
    loop.create_task(process(frame))
    ....
    return Gst.PadProbeReturn.OK
4

1 回答 1

0
  1. 是的,Python中的gstreamer循环是asyncio

  2. 好吧,您可以像我一样这样做(通过创建全局变量来做坏事)

     ws = None
     loopIO = None
    
     def tiler_sink_pad_buffer_probe(pad,info,u_data):
         global ws
         global loopIO
         ....
         ### capture the frames in GPU buffer converting into numpy
    
         if ws and loopIO:
             _, jpeg_frame = cv2.imencode('.jpg', frame_image)
             str_pic = jpeg_frame.tobytes()
             asyncio.run_coroutine_threadsafe(ws.send(str_pic), loopIO)
         ....
         return Gst.PadProbeReturn.OK
    
     if __name__ == '__main__':
         start_server = websockets.serve(consumer_handler, 'localhost', 8765)
         loopIO = asyncio.get_event_loop()
         loopIO.run_until_complete(start_server)
         wst = threading.Thread(target=asyncio.get_event_loop().run_forever)
         wst.daemon = True
         wst.start()
         sys.exit(main(sys.argv))
    
于 2021-02-03T10:50:27.887 回答