根据其RTSP appsrc客户端

时间:2016-12-01 08:46:50

标签: c++ server gstreamer record rtsp

我的层次结构如下:

SourcePipeline

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

GstRTSPServer

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

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

我的关于appink和appsrc的上限是

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

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

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

我有一些问题和疑问:

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

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

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

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

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

1 个答案:

答案 0 :(得分:1)

在我用

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

我已经怀疑缓冲时间戳,但无法弄清楚如何解决它们。只要在源管道和接收管道之间使用相同的时钟,这三条线就可以轻松解决问题。