根据其 RTSP appsrc 客户端控制 appsink 管道的状态
Controlling the state of appsink pipeline depending on its RTSP appsrc clients
我有如下层次结构:
源管道
- GstElement 管道(有一个 videotestsrc 和 appsink)
- 用于推送示例的 GstAppSrc 指针数组
GstRTSPServer
GstRTSPMediaFactory(有一个名为 "appsrc0" 的 GstAppSrc 并安装在
"/测试")
GstRTSPMediaFactory(有一个名为 "appsrc1" 的 GstAppSrc 并安装在“/test2”)
我对 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 再次加入。
我有一些疑问和问题:
当第一个客户端连接到 RTSP 时,客户端立即获得流。当第二个加入第二个挂载点时,当 GstRTSPMedia 将其状态更改为 GST_STATE_PLAYING 时流暂停,并在 5 - 6 秒后流再次恢复。不过,这有时不会发生。流失败,我无法在重新启动程序之前再次启动它。
我控制SourcePipeline的方法是否正确?我应该如何在 RTSP 服务器上执行此操作?
我将 appsrc 的块 属性 设置为 TRUE。如果我不将其设置为 true,它会使用所有内存,直到系统变得无响应。同样,这里正确的方法是什么?
我目前正在使用 push_sample 将缓冲区推送到 appsrc。 push_sample 和 push_buffer 有什么区别?哪个更有效?
当不同安装点上的 2 个客户端正在观看流时,当其中 1 个客户端断开连接或停止流时,它会中断流。我检查 GstRTSPMedia 上的新状态信号以了解 RTSP 管道的状态。显然这种方法行不通,这里正确的方法是什么?
在我用
解决了时间戳后,我不需要在 appsink 和 appsrc 之间做任何同步
GST_BUFFER_TIMESTAMP(buf) = timestamps[i];
GST_BUFFER_DURATION(buf) = bufferDuration;
timestamps[i] += GST_BUFFER_DURATION(buf);
我已经对缓冲区时间戳产生了怀疑,但不知道如何解决它们。这 3 条线很容易解决这个问题,只要在源管道和接收管道之间使用相同的时钟。
我有如下层次结构:
源管道
- GstElement 管道(有一个 videotestsrc 和 appsink)
- 用于推送示例的 GstAppSrc 指针数组
GstRTSPServer
GstRTSPMediaFactory(有一个名为 "appsrc0" 的 GstAppSrc 并安装在 "/测试")
GstRTSPMediaFactory(有一个名为 "appsrc1" 的 GstAppSrc 并安装在“/test2”)
我对 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 再次加入。
我有一些疑问和问题:
当第一个客户端连接到 RTSP 时,客户端立即获得流。当第二个加入第二个挂载点时,当 GstRTSPMedia 将其状态更改为 GST_STATE_PLAYING 时流暂停,并在 5 - 6 秒后流再次恢复。不过,这有时不会发生。流失败,我无法在重新启动程序之前再次启动它。
我控制SourcePipeline的方法是否正确?我应该如何在 RTSP 服务器上执行此操作?
我将 appsrc 的块 属性 设置为 TRUE。如果我不将其设置为 true,它会使用所有内存,直到系统变得无响应。同样,这里正确的方法是什么?
我目前正在使用 push_sample 将缓冲区推送到 appsrc。 push_sample 和 push_buffer 有什么区别?哪个更有效?
当不同安装点上的 2 个客户端正在观看流时,当其中 1 个客户端断开连接或停止流时,它会中断流。我检查 GstRTSPMedia 上的新状态信号以了解 RTSP 管道的状态。显然这种方法行不通,这里正确的方法是什么?
在我用
解决了时间戳后,我不需要在 appsink 和 appsrc 之间做任何同步GST_BUFFER_TIMESTAMP(buf) = timestamps[i];
GST_BUFFER_DURATION(buf) = bufferDuration;
timestamps[i] += GST_BUFFER_DURATION(buf);
我已经对缓冲区时间戳产生了怀疑,但不知道如何解决它们。这 3 条线很容易解决这个问题,只要在源管道和接收管道之间使用相同的时钟。