我是 Gstreamer 新手。
我的 GStreamer 管道中有一个 RTSP 源,可以成功传输包。但是,如果暂时失去连接,管道将完全停止。我想实现一个解决方案,在检测到错误消息时,管道通过向其提供虚拟帧(例如,使用 videotestsrc pattern=black)来继续流式传输,直到连接恢复。
正如 Gstreamer 官方文档所述:“元素没有决定如何处理错误所需的上下文。因此,它们应该只通知错误,并停止处理。简而言之,元素不知道它是什么正在被用于”。如何检测和处理 GStreamer 中的连接错误?有没有办法修改管道以在连接中断期间保持活动状态并在重新建立连接后恢复正常流传输?
任何见解或代码示例将不胜感激。谢谢!
以下是我所做工作的高级概述:
我尝试使用获取 GstMessage
gst_bus_timed_pop_filtered()
然后,如果消息指出错误,请删除 rtspsrc 并将其替换为 videotestsrc。
gst_bin_remove(GST_BIN(pipeline), rtspsrc);
gst_bin_add(GST_BIN(pipeline), videotestsrc);
但是,这种方法显然是错误的,因为它没有考虑连接恢复(必须再次切换到 rtspsrc)。
一个可能有效的建议是向 rtspsrc 的 pad 添加一个探针以检测任何错误。一旦检测到错误,请尝试通过替换 videotestsrc 来操纵管道。
(我的最终目标是拥有一个不间断的并发视频流,不受可能终止整个管道的意外错误的影响)。
这也是我也面临的问题,但涉及输出侧。我目前正在努力的解决方案是使用
output-selector
元素。这允许在管道保持在 PLAYING
状态时切换输出元素。这也可以手动完成,但 output-selector
元素使其变得非常简单。
我有 2 个水槽连接到
output-selector
:srtsink
和一个 fakesink
。在初始化期间,我将输出设置为 srtsink
,当我发现连接已断开并出现 bus_call
时,我切换到 fakesink
您可以做类似的事情,但是使用
input-selector
元素。
将 rtspsrc
和 videotestsrc
作为 2 个输入连接到 input-selector
,当您从 EOS
捕获 ERROR
或 rtspsrc
时,将活动打击垫设置为 videotestsrc
。然后,您可以从不同的线程监控 rtsp 源,以便在网络恢复时切换回来。