我正在尝试构建一个GStreamer管道,该管道将来自多个摄像机的图像交织成单个数据流,该数据流可以通过神经网络传输,然后分成单独的分支进行下沉。我成功使用appsrc
插件和Basler Pylon 5 - USB 3.0 API来创建交错式Feed。但是,在我完成编写神经网络GStreamer元素的工作之前,我想让分裂工作。
目前,我正在考虑使用" ID"标记图像。表明它来自哪个相机。然后我想我可以使用这个标签分割数据流。但是,我无法找到任何涉及此问题的主题。我已经看到你可以使用tee
插件来分支管道,但我还没有看到它曾经基于标签进行拆分。是否可以使用tee
来执行此操作?
我看到有人使用tee
根据来源拆分Feed,如下所示:
gst-launch-1.0 -vvv \
tee name=splitter \
$VSOURCE \
! $VIDEO_DECODE \
! $VIDEO_SINK splitter. \
$VSOURCE1 \
! $VIDEO_DECODE \
! $VIDEO_SINK splitter.
但是,这不允许我通过神经网络元素有一条路径。
如果它有帮助,这是我设想的管道的diagaram:
cam1 ---\ /---> udpsink/appsink
\ /
appsrc-->neural_network-->tee---
/ \
cam2 ---/ \---> udpsink/appsink
答案 0 :(得分:2)
tee元素只是将相同的数据转发到两个分支。您应该编写另一个获取输入的元素,并仅输出您感兴趣的流的数据。
您还应该在每个分支后面放置一个队列元素,为每个分支提供单独的线程。我调用元素来拆分流camfilter,它具有属性id
:
cam1 ---\ /---> queue --> camfilter id=1 --> udpsink/appsink
\ /
appsrc-->neural_network-->tee---
/ \
cam2 ---/ \---> queue --> camfilter id=2 --> udpsink/appsink
答案 1 :(得分:0)
询问此问题时不可用。但是,自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等。