根据其 RTSP appsrc 客户端控制 appsink 管道的状态

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

我有如下层次结构:

源管道

GstRTSPServer

我对 appsink 和 appsrc 的上限是

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

因此,在媒体工厂中,我监听媒体构造的信号并将 appsrc 指针注册到源管道。此外,当他们的媒体状态更改为 GST_STATE_NULL 时,我从 SourcePipeline 中的 appsrc 数组中删除了指针。

在源管道上,appsink 将样本一个一个地推送到appsrc。当阵列上没有剩余的 appsrc 时,管道的状态将更改为 GST_STATE_NULL,直到第一个 appsrc 再次加入。

我有一些疑问和问题:

  1. 当第一个客户端连接到 RTSP 时,客户端立即获得流。当第二个加入第二个挂载点时,当 GstRTSPMedia 将其状态更改为 GST_STATE_PLAYING 时流暂停,并在 5 - 6 秒后流再次恢复。不过,这有时不会发生。流失败,我无法在重新启动程序之前再次启动它。

  2. 我控制SourcePipeline的方法是否正确?我应该如何在 RTSP 服务器上执行此操作?

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

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

  5. 当不同安装点上的 2 个客户端正在观看流时,当其中 1 个客户端断开连接或停止流时,它会中断流。我检查 GstRTSPMedia 上的新状态信号以了解 RTSP 管道的状态。显然这种方法行不通,这里正确的方法是什么?

在我用

解决了时间戳后,我不需要在 appsink 和 appsrc 之间做任何同步
GST_BUFFER_TIMESTAMP(buf) = timestamps[i];
GST_BUFFER_DURATION(buf) = bufferDuration;
timestamps[i] += GST_BUFFER_DURATION(buf);

我已经对缓冲区时间戳产生了怀疑,但不知道如何解决它们。这 3 条线很容易解决这个问题,只要在源管道和接收管道之间使用相同的时钟。