带有多个摄像头的gstreamer:如何根据摄像头标识符分割管道?

带有多个摄像头的gstreamer:如何根据摄像头标识符分割管道?,gstreamer,gstreamer-1.0,Gstreamer,Gstreamer 1.0,我正在尝试构建一个GStreamer管道,它将来自多个摄像头的图像交错到一个数据流中,该数据流可以通过神经网络传递,然后分割成单独的分支进行下沉。我正在成功地使用appsrc插件和Basler Pylon 5-USB 3.0 API创建交错提要。然而,在我完成编写神经网络GStreamer元素的工作之前,我想先完成拆分工作 目前,我正在考虑用一个“ID”标记图像,指示它来自哪个摄像头。然后我想我可以用这个标签分割数据流。然而,我未能找到任何与这一问题有关的主题。我已经看到可以使用teeplugi

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

目前,我正在考虑用一个“ID”标记图像,指示它来自哪个摄像头。然后我想我可以用这个标签分割数据流。然而,我未能找到任何与这一问题有关的主题。我已经看到可以使用
tee
plugin来分支管道,但我还没有看到它用于基于标记进行拆分。是否可以使用
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的流camfilter:

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

当提出此问题时,此选项不可用。但是,自2018年夏季以来,如果您想减少使用appsrc和相机帧处理实现自己的“合并”代码的工作量,可以使用nnstreamer。这也让你更容易替换神经网络

随着最近添加支持GTRAPER插件的神经网络“nnStuffER”(),您可以在中间没有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等。所以我应该能够使用标签实现过滤器?是的,你可以使用标签