video - Gstreamer - 如何构建具有多个 src 的应用程序?

标签 video architecture gstreamer

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

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

  • 暂停特定的相机
  • 让每个 rtspsrc 完全隔离,所以一个错误不会影响整个管道
  • 监听特定相机上的事件

如果我将所有摄像头放在一个管道中,我不知道如何暂停特定摄像头。我不能暂停整个流水线,因为那样会停止所有摄像头。我想出的最好的方法是删除和不同于特定相机的元素,然后在恢复时重新添加和重新链接。这有点像。如果特定的 rtspsrc 停止响应,那么整个管道都会停止。如果特定的 rtspsrc 不存在,则整个管道将不会转换为 PLAYING 状态

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

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

最佳答案

单体架构 should generally be avoided在编程中,您的场景也不异常(exception)。您已经经历过在一个管道中管理所有内容的一些复杂情况,发现的解决方法可能会在未来导致更多问题,而且它们不提供管理每个摄像头的便捷访问。

因此,我建议采用第二种方法,让每个摄像头都有一个管道,并另外使用类似于 this SO answer 中的架构实现缓冲队列。 .您可能还想确保您的单例 is thread safe以避免在从相机发送分析时管道之间出现任何竞争情况。

关于video - Gstreamer - 如何构建具有多个 src 的应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56086186/

相关文章:

gstreamer - 如何将 flv 文件(由 gstreamer flvmux 编码,包含带有 aac 音频的 h264 视频)流式传输到 rtmp 服务器而不解码?

macos - 无法从 Gstreamer 找到 get-launch-1.0

audio - ffmpeg:设置音频流的语言

javascript - 如何通过 AJAX 发送 YouTube 视频元数据

c# - 对象的组成与函数: Should I use one method interfaces or delegates?

architecture - 对于建筑师来说,您知道 NDepend 的替代方案吗?

entity-framework - WCF 数据服务实现策略

linux - 在远程 VLC 上使用 FFMPEG 流式传输 MP4

javascript - 在浏览器中显示 mp4 流媒体视频

udp - 无法显示通过 UDP 使用 GStreamer 流式传输的 h.264 网络摄像头图像