gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 22:58:20 24 4
gpt4 key购买 nike

我有如下层次结构:

源流水线

  • GstElement 管道(有一个 videotestsrc 和 appsink)
  • 用于推送样本的 GstAppSrc 指针数组

GstRTSP服务器

  • GstRTSPMediaFactory(有一个名为“appsrc0”的 GstAppSrc 并安装在"/测试")

  • GstRTSPMediaFactory(有一个名为“appsrc1”并安装在“/test2”上的 GstAppSrc)

我对 appsink 和 appsrc 的限制是

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

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

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

我有一些疑问和问题:

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

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

  3. 我将 appsrc 的 block 属性设置为 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 条线很容易解决这个问题,只要在源管道和接收器管道之间使用相同的时钟。

关于c++ - 根据其 RTSP appsrc 客户端控制 appsink 管道的状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40906096/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com