合并多个分支(队列)时GStreamer如何管理线程

问题描述 投票:0回答:1

我有一个GStreamer管道,可以记录三个实时摄像头,基本上可以执行以下操作:在第一个线程中捕获3个凸轮;然后在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 

我的管道运行良好,我只需澄清它的内部行为:

我知道如何强制使用单独的线程与元素队列。但是我不知道当我的3 [rescale]分支在我的情况下在单个元素(如compo)中合并时会发生什么。

GStreamer是否会按要求创建3个主题? 如果是,那么合成器在哪些线程中运行? 如果没有,我是否只有一个线程用于整个重新缩放+合成过程?

感谢您分享的任何信息! 问候

gstreamer gstreamer-1.0
1个回答
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.
© www.soinside.com 2019 - 2024. All rights reserved.