首页 > 解决方案 > Gstreamer - 如何使用多个 src 构建应用程序?

问题描述

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

所以我有多个摄像头,输入这个单一的元素,然后输出,进入应用程序。这工作得相当好,但我希望能够:

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

我应该如何构建我的应用程序?你认为我应该有一个单一的大管道吗?或者我应该有一个包含单例分析元素的管道,每个摄像头都有一个管道,然后使用appsink和appsrc连接它们?这种方法可能会使处理事情变得更容易,因为每个管道都是完全独立的?

如果您需要更多信息,请告诉我。

标签: videoarchitecturegstreamer

解决方案


在编程中通常应避免使用单体架构,您的场景也不例外。您已经经历了在一个管道中管理所有内容的一些复杂性,并且找到的解决方法可能会导致更多问题,而且它们不提供管理每台摄像机的便捷访问。

因此,我建议采用第二种方法,为每个摄像头设置一个管道,并另外使用类似于此 SO answer的架构来实现用于缓冲的队列。您可能还希望确保您的单例是线程安全的,以避免在从摄像头发送分析数据时管道之间的任何竞争条件。


推荐阅读