根据其RTSP AppSRC客户端控制AppSink管道状态

Controlling the state of appsink pipeline depending on its RTSP appsrc clients

本文关键字:控制 AppSink 管道 状态 客户端 AppSRC RTSP      更新时间:2023-10-16

我具有下面的层次结构:

sourcePipeline

  • gstelement Pipeline(具有videotestsrc和appsink)
  • gstappsrc指针阵列推动样品

gstrtspserver

  • gstrtspmediafactory(具有名为" appsrc0"的GSTAPPSRC,并安装在"/test")

  • gstrtspmediafactory(具有名为" appsrc1"的gstappsrc,并安装在"/test2"上)

我在appsink和appsrc上的帽子是

caps = "video/x-raw,width=640,height=512,format=GRAY8" 

因此,在媒体工厂中,我会收听媒体构造的信号,并注册AppsRC指针以源管道。同样,当他们的媒体将状态更改为gstrongtate_null时,我会从sourcePipeline中的appsrc数组中删除指针。

在源管道上,AppSink将样本推到AppSRC一个一个。当数组上没有APPSRC时,管道的状态将更改为GstrongTATE_NULL,直到再次加入第一个AppSRC。

我有一些问题和问题:

  1. 当第一个客户端连接到RTSP时,客户端会立即获取流。当第二个连接到第二个坐骑时,当GSTRTSPMedia将其状态更改为GstrongTATE_PLAYING时,流暂停,5-6秒后再次恢复流。不过,这有时不会发生。该流失败,在重新启动程序之前,我无法再次将其提起。

  2. 我控制源pline的方法正确吗?我应该如何在RTSP服务器上进行操作?

  3. 我在True上设置了AppSRC的块属性。如果我不将其设置为true,它将使用所有内存,直到系统无响应为止。同样,这里的正确方法是什么?

  4. 我目前正在使用push_sample将缓冲区推向AppSRC。push_sample和push_buffer有什么区别?哪个更有效?

  5. 当不同的山顶上的2个客户观看流时,当其中1个断开或停止流时,它会破坏流。我在GSTRTSPMedia上检查新州信号,以了解RTSP管道的状态。显然,这种方法不起作用,这里的正确方法是什么?

我不需要在用

求解时间stamp之后,在appsink和appsrc之间进行任何同步
GST_BUFFER_TIMESTAMP(buf) = timestamps[i];
GST_BUFFER_DURATION(buf) = bufferDuration;
timestamps[i] += GST_BUFFER_DURATION(buf);

我已经怀疑缓冲时间戳记,但无法弄清楚如何解决它们。只要在源管道和接收器管道之间使用相同的时钟,这3行很容易解决问题。