我的层次结构如下:
SourcePipeline
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再次加入。
我有一些问题和疑问:
当第一个客户端连接到RTSP时,客户端立即获取流。当第二个加入第二个挂载点时,当GstRTSPMedia将其状态更改为GST_STATE_PLAYING时,流暂停,并且在5-6秒后,流再次恢复。但这有时不会发生。流失败,重新启动程序之前我无法再次启动它。
我控制SourcePipeline的方法是否正确?我该如何在RTSP服务器上执行此操作?
我将appsrc的block属性设置为TRUE。如果我没有将其设置为true,它将使用所有内存,直到系统无响应。同样,这里的正确方法是什么?
我目前正在使用push_sample将缓冲区推送到appsrcs。 push_sample和push_buffer有什么区别?哪个更有效?
当不同挂载点上的2个客户端正在观看流时,当其中一个客户端断开连接或停止流时,它会将流中断。我检查GstRTSPMedia上的新状态信号以了解RTSP管道的状态。显然这种方法不起作用,这里的正确方法是什么?
答案 0 :(得分:1)
在我用
解决时间戳之后,我不需要在appsink和appsrc之间进行任何同步GST_BUFFER_TIMESTAMP(buf) = timestamps[i];
GST_BUFFER_DURATION(buf) = bufferDuration;
timestamps[i] += GST_BUFFER_DURATION(buf);
我已经怀疑缓冲时间戳,但无法弄清楚如何解决它们。只要在源管道和接收管道之间使用相同的时钟,这三条线就可以轻松解决问题。