我有一个GStreamer管道,它记录了三个实时摄像机,并且基本上执行以下操作:在第一个线程中捕获3个cam;然后在3个独立的线程中对3个流进行一些处理;并行地在其他3个线程中重新缩放合成器(适用于实时信号源的视频混合器)的帧;最后做作文。每个摄像机的计划如下(因此x3):
[capture] -> TEE |-> QUEUE -> [someProcessing] -> _
|-> QUEUE -> [rescale] -> COMPOSITOR
gst-launch-1.0 \
${capture0} ! tee name='t0' ! queue ! ${someProcessing0} \
${capture1} ! tee name='t1' ! queue ! ${someProcessing1} \
${capture2} ! tee name='t2' ! queue ! ${someProcessing2} \
${someStuff} \
compositor name=compo ${compositorSinkProperties} \
t0. ! queue ! ${rescale0} ! compo.sink_0 \
t1. ! queue ! ${rescale1} ! compo.sink_1 \
t2. ! queue ! ${rescale2} ! compo.sink_2 \
-e
我的管道运行良好,我只需要澄清它的内部行为:
我知道如何通过元素 queue 强制使用单独的线程。但是,我不知道将3个[重新缩放]分支合并到单个元素(例如我的 compo )中时会发生什么情况。
GStreamer是否按照要求创建3个线程?
如果是,那么合成器在哪个线程中运行?
如果没有,整个 rescaling + compositing 过程中我只有1个线程吗?
感谢您分享的任何信息!
问候
答案 0 :(得分:0)
据我所知您是正确的。您将拥有下游所有队列路径的线程。我认为聚合器也有自己的线程。我缺乏证据-也许您可以在GstAggregator类中发现它。
但是一旦聚合器上的所有接收盘都具有数据,它的aggregate
函数就会触发。
来自基类文档here:
aggregate ()
Mandatory. Called when buffers are queued on all sinkpads. Classes should
iterate the GstElement->sinkpads and peek or steal buffers from the
GstAggregatorPads. If the subclass returns GST_FLOW_EOS, sending of the
eos event will be taken care of. Once / if a buffer has been constructed
from the aggregated buffers, the subclass should call _finish_buffer.