我正在使用CSI摄像头输入的流式设备。我想用tee复制不可启动流,然后使用gst服务器使用不同的url访问这些流中的每一个。我只能有一个消费者在我的相机,所以这是不可能有两个独立的管道。这个是可能的吗?请参见下面的伪管道。
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,然后回调到新的样本信号,就像这样。
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正在排队缓冲,直到它开始将它们推送到它的源衬垫上--在调试输出下面,您可以看到它稳定在其上的排队字节数。
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运行我的测试应用程序,那么我将得到如下输出。
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
发布于 2022-05-06 18:10:20
我能想到三种可能性:
您将手动从app接收器中取出缓冲区,并将它们推入不同的appsrcs中。
https://stackoverflow.com/questions/72133785
复制相似问题