Gstreamer-如何用多个src构建应用程序?

时间:2019-05-11 00:11:43

标签: video architecture gstreamer

在这种情况下,我有多个摄像头(rtspsrc)和一个singleton元素,它们对传入的视频流进行分析。我称它为单例元素,因为它具有请求源和接收器垫。应用程序中应该只存在其中之一,因为它可以在GPU上运行,并且可以通过批量处理获得更好的性能。将我正在构建的应用程序视为API,以添加相机,移除相机,打开和关闭每个相机的分析等。相机将对其进行分析,捕获结果并继续发送。麻烦的是,我需要共享一个Gstreamer元素(分析元素)。

因此,我有多个摄像头,将其馈入该单个元素,然后馈入到appinks中。这相当不错,但是我希望能够:

  • 暂停特定的摄像头
  • 每个rtspsrc都应完全隔离,这样一个错误不会影响整个管道
  • 收听特定摄像机上的事件

如果我将所有摄像机都放在管道中,则无法弄清楚如何暂停特定摄像机。我无法暂停整个管道,因为这将停止所有摄像机。我想出的最好办法是删除并与特定摄像机的元素不同,然后在恢复时重新添加并重新链接。这有点。如果特定的rtspsrc停止响应,则整个管道都将停止。如果特定的rtspsrc不存在,那么整个管道将不会转换为PLAYING状态

我应该如何构建我的应用程序?您认为我应该只有一条大型管道吗?还是应该有一个包含单例分析元素的管道,以及每个摄像机的管道,然后使用appsink和appsrc将它们连接起来?这种方法可能使事情变得更容易,因为每个管道都是完全独立的?

让我知道是否需要更多信息。

2 个答案:

答案 0 :(得分:2)

鉴于您的需求,我将使用MVVM模式和DI容器在c#中构建大多数API,摄像机管理和GUI,因此您将尽可能多地分离API部件,并使它们尽可能可测试。另一个动机是,使用这种生态系统(C#,Visual Studio)生成UI很快。同样对于大多数项目,您知道维护将是主要的成本Development cost versus maintenance cost,因此对接口进行解耦和测试是极好的,可以将这些成本保持在最低水平。 MVVM将允许您测试UI Writing a Testable Presentation Layer with MVVM。对软件组件进行解耦还可以使您无需升级其余部分即可升级某个实现,并在composition root中将其组件与软件组合在一起。通常,这种做法可让您从测试(TDD)开始。

为了确保资源管理,我会确保每个摄像头有1条管道,并且如果您使用cudastream(cudastreams to simplify concurrency),则可以在一个GPU上执行多个视频分析任务,每个流都对一个摄像机视频流。您可能想使用来自opencv的一些经过验证的代码,并确保其可在cudastream中转座。如果不需要/不需要这样的数据量,性能要求和硬件,则可以只使用一个opencv处理。

在本机部分(gstreamer)上,将组件与具有互操作性的c#接口相对容易;例如:

var elektron = document.querySelector('#ParticleSystem');
var scene = document.querySelector('a-scene');

//Var for the two sliders
var rangeCurrent = document.querySelector('#rangeCurrent');
var rangeVoltage = document.querySelector('#rangeVoltage');

var current = rangeCurrent.value;
var voltage = rangeVoltage.value;

//EventListener for the slider
rangeCurrent.addEventListener('change', function(){
  current = rangeCurrent.value;
  elektron.setAttribute('particle-system', {size: current});
});

并在受管部分:

extern "C" __declspec(dllexport) auto Query(myClass* p, const wchar_t* somePath)
    -> structResult*
{ return p->Query(somePath); }

答案 1 :(得分:1)

编程中的整体架构should generally be avoided,您的情况也不例外。您已经在管理一个管道中的所有内容时遇到了一些复杂问题,发现的解决方法很可能会导致更多问题,而且它们并不能为管理每台摄像机提供便利。

因此,我建议采用第二种方法,使每个摄像头具有一条流水线,并另外以类似于this SO answer的体系结构来实现用于缓冲的队列。您可能还需要确保自己的is thread safe单身人士,以免在从摄像机发送分析数据时在管道之间出现任何竞争情况。