自定义应用程序中的DeepStream python应用程序



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

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

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

2-如您所知,如果我们在pad prob函数中添加额外的操作,这会导致性能下降,但我想知道,是否可以将帧放在pad prob函数中,并像async一样执行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
Python中的Yeap-gstreamer循环是异步
  • 好吧,你可以像我一样这样做(通过创建全局变量的糟糕方式(

    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))
    
  • 相关内容

    • 没有找到相关文章

    最新更新