具有多个摄像机的 gstreamer:如何根据摄像机标识符拆分管道?



我正在尝试构建一个GStreamer管道,它将来自多个相机的图像交错成单个数据流,该数据流可以通过神经网络传递,然后拆分为单独的分支进行下沉。我已成功使用appsrc插件和 Basler Pylon 5 - USB 3.0 API 创建交错源。但是,在我完成编写神经网络 GStreamer 元素的工作之前,我想让拆分工作。

目前,我正在考虑用"ID"标记图像,指示它来自哪个相机。然后我想我可以使用此标签拆分数据流。但是,我无法找到任何确切处理此问题的主题。我已经看到您可以使用tee插件来分支管道,但我还没有看到它用于根据标签进行拆分。是否可以使用tee来执行此操作?

我见过人们使用tee根据来源拆分提要

,如下所示:
gst-launch-1.0 -vvv 
tee name=splitter 
$VSOURCE 
! $VIDEO_DECODE 
! $VIDEO_SINK splitter. 
$VSOURCE1 
! $VIDEO_DECODE 
! $VIDEO_SINK splitter.

但是,这不允许我通过神经网络元素的单一路径。

如果有帮助,这是我设想的管道的直径:

cam1 ---                                  /---> udpsink/appsink                              
                                / 
appsrc-->neural_network-->tee---
/                                
cam2 ---/                                  ---> udpsink/appsink

tee 元素只是将相同的数据转发到两个分支。您应该编写另一个元素,该元素接受输入并仅输出您感兴趣的流的数据。

还应在每个分支后面放置一个队列元素,以便为每个分支提供单独的线程。我调用了该元素来拆分具有属性id的流凸轮过滤器:

cam1 ---                                  /---> queue --> camfilter id=1 --> udpsink/appsink                              
                                / 
appsrc-->neural_network-->tee---
/                                
cam2 ---/                                  ---> queue --> camfilter id=2 --> udpsink/appsink

当提出这个问题时,这不可用。但是,从 2018 年夏季开始,如果您想减少实现自己的"合并"代码与 appsrc 和相机帧处理的工作量,您可以使用 nnstreamer。这也使您可以更轻松地替换神经网络。

通过最近添加的神经网络支持gstreamer插件"nnstreamer"(https://github.com/nnsuite/nnstreamer),您可以在中间没有appsrc的情况下做到这一点,从而减少实现的工作量:

cam1 (gst src) ---> videoconvert,scale,... --> tensor_converter --

tensor_merge (or tensor_mux depending on the input dimensions) --> tensor_filter (framework=tf_lite, model=abc.tflite) --> tee --> (same from here)
/
cam2 (gst src) ---> videoconvert,scale,... --> tensor_converter --/

请注意,它还支持 pytorch、caffe2、tf 等。

最新更新