首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >不同urls的Gstreamer rtsp服务器

不同urls的Gstreamer rtsp服务器
EN

Stack Overflow用户
提问于 2022-05-05 21:21:56
回答 1查看 411关注 0票数 0

我正在使用CSI摄像头输入的流式设备。我想用tee复制不可启动流,然后使用gst服务器使用不同的url访问这些流中的每一个。我只能有一个消费者在我的相机,所以这是不可能有两个独立的管道。这个是可能的吗?请参见下面的伪管道。

代码语言:javascript
运行
复制
source -> tee name=t -> rtsp with url0 .t -> rtsp with url1

谢谢!

编辑1:

我尝试了第一种解决方案,并使用app接收器\ appsrc对,但我只成功了一半。现在我有两条管道。

nvv4l2camerasrc device=/dev/video0 ! video/x-raw(memory:NVMM), width=1920, height=1080, format=UYVY, framerate=50/1 ! nvvidconv name=conv ! video/x-raw(memory:NVMM), width=1280, height=720, format=NV12, framerate=50/1 ! nvv4l2h264enc control-rate=1 bitrate=10000000 preset-level=1 profile=0 disable-cabac=1 maxperf-enable=1 name=encoder insert-sps-pps=1 insert-vui=1 ! appsink name=appsink sync=false

appsrc name=appsrc format=3 is-live=true do-timestamp=true ! queue ! rtph264pay config-interval=1 name=pay0

第二个管道用于创建媒体工厂。我把缓冲区从app接收器推到appsrc,然后回调到新的样本信号,就像这样。

代码语言:javascript
运行
复制
static GstFlowReturn
on_new_sample_from_sink (GstElement * elt, void * data)
{
    GstSample *sample;
    GstFlowReturn ret = GST_FLOW_OK;
 

    /* get the sample from appsink */
    sample = gst_app_sink_pull_sample (GST_APP_SINK (elt));
    if(appsrc)
    {
      ret = gst_app_src_push_sample(GST_APP_SRC (appsrc), sample);
    }
  
    gst_sample_unref (sample);
 
    return ret;
}

这工作-视频是流的,可以看到在不同的机器上使用gstreamer或vlc。问题是延迟。由于某些原因,延迟约为3s。当我将这两个管道合并为一个,直接使用app接收器和appsrc创建媒体工厂时,它工作得很好,没有很大的延迟。

我认为,出于某种原因,appsrc正在排队缓冲,直到它开始将它们推送到它的源衬垫上--在调试输出下面,您可以看到它稳定在其上的排队字节数。

代码语言:javascript
运行
复制
0:00:19.202295929  9724   0x7f680030f0 DEBUG                 appsrc gstappsrc.c:1819:gst_app_src_push_internal:<appsrc> queue filled (1113444 >= 200000)
0:00:19.202331834  9724   0x7f680030f0 DEBUG                 appsrc gstappsrc.c:1819:gst_app_src_push_internal:<appsrc> queue filled (1113444 >= 200000)
0:00:19.202353818  9724   0x7f680030f0 DEBUG                 appsrc gstappsrc.c:1863:gst_app_src_push_internal:<appsrc> queueing buffer 0x7f58039690
0:00:19.222150573  9724   0x7f680030f0 DEBUG                 appsrc gstappsrc.c:1819:gst_app_src_push_internal:<appsrc> queue filled (1141310 >= 200000)
0:00:19.222184302  9724   0x7f680030f0 DEBUG                 appsrc gstappsrc.c:1819:gst_app_src_push_internal:<appsrc> queue filled (1141310 >= 200000)

编辑2:

我将max-buffers属性添加到app接收器中,并建议将属性添加到队列中,但这一点帮助都没有。

我只是不明白它怎么能缓冲这么多缓冲区,以及为什么。如果我使用GST_DEBUG=appsrc:5运行我的测试应用程序,那么我将得到如下输出。

代码语言:javascript
运行
复制
0:00:47.923713520 14035   0x7f68003850 DEBUG                 appsrc gstappsrc.c:1819:gst_app_src_push_internal:<appsrc> queue filled (2507045 >= 200000)
0:00:47.923757840 14035   0x7f68003850 DEBUG                 appsrc gstappsrc.c:1819:gst_app_src_push_internal:<appsrc> queue filled (2507045 >= 200000)

根据这个调试输出,即使它的max字节属性设置为200 000字节,也都在appsrc中排队。也许我不太理解,但在我看来很奇怪。

我尝试了第一种解决方案,并使用app接收器\ appsrc对,但我只成功了一半。现在我有两条管道。

我的管道现在是这样的。

nvv4l2camerasrc device=/dev/video0 ! video/x-raw(memory:NVMM), width=1920, height=1080, format=UYVY, framerate=50/1 ! queue max-size-buffers=3 leaky=downstream ! nvvidconv name=conv ! video/x-raw(memory:NVMM), width=1280, height=720, format=NV12, framerate=50/1 ! nvv4l2h264enc control-rate=1 bitrate=10000000 preset-level=1 profile=0 disable-cabac=1 maxperf-enable=1 name=encoder insert-sps-pps=1 insert-vui=1 ! appsink name=appsink sync=false max-buffers=3

appsrc name=appsrc format=3 stream-type=0 is-live=true do-timestamp=true blocksize=16384 max-bytes=200000 ! queue max-size-buffers=3 leaky=no ! rtph264pay config-interval=1 name=pay0

EN

回答 1

Stack Overflow用户

发布于 2022-05-06 18:10:20

我能想到三种可能性:

  1. 使用app接收器/appsrc (如本例所示)以如下方式分隔管道: 带有URL 1捕获管道的工厂。编码器!rtph264pay v4l2src!应用程序!编码器!rtph264pay‘

您将手动从app接收器中取出缓冲区,并将它们推入不同的appsrcs中。

  1. 构建类似于上面的内容,但是使用类似于内管视频链接的东西来代替app接收器/appsrc来自动执行缓冲区传输。
  2. 使用类似于GstRtspSink (付费产品)的产品
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72133785

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档