将 `rtspsrc` 添加到正在运行的 Gstreamer 管道时,RTSP 流不会启动/超时

问题描述 投票:0回答:1

我有一个 Gstreamer 管道(基于 NVIDIA 的“deepstream-app”参考实现),它将在启动时使用

rtspsrc
成功播放 RTSP 流。

但是,如果我尝试在管道运行后(例如一两分钟后)添加这些相同的流,则该流将不会启动并且似乎超时。

我相当确定我在两种情况下使用相同的代码(即管道前运行和管道后运行),唯一的例外是后一种情况有一个显式调用将元素的状态设置为

GST_STATE_PLAYING
,成功了:

gboolean play_source(GstElement *source) {
  GstStateChangeReturn ret = gst_element_set_state(source, GST_STATE_PLAYING);
  /* 'ret' always contains GST_STATE_SUCCESS */
  /* ... */

我尝试了各种级别的日志输出(低至调试),但似乎没有什么真正突出的。

当设置为 WARN 时,在第一种情况下,我看到如下输出:

0:01:29.002271420     1 0x55c2ce502580 INFO                 rtspsrc gstrtspsrc.c:7788:gst_rtspsrc_retrieve_sdp:<src_elem0> Now using version: 1.0
0:01:30.079726768     1 0x55c2ce502580 INFO                 rtspsrc gstrtspsrc.c:3953:gst_rtspsrc_stream_configure_manager:<src_elem0> configure bandwidth in session 0x55c2cd870f70
0:01:35.084717848     1 0x55c2ce502580 WARN                 rtspsrc gstrtspsrc.c:5769:gst_rtspsrc_reconnect:<src_elem0> warning: Could not receive any UDP packets for 5.0000 seconds, maybe your firewall is blocking it. Retrying using a tcp connection.
WARNING from src_elem0: Could not read from resource.
Debug info: gstrtspsrc.c(5769): gst_rtspsrc_reconnect (): /GstPipeline:pipeline/GstBin:multi_src_bin/GstBin:src_sub_bin0/GstRTSPSrc:src_elem0:
Could not receive any UDP packets for 5.0000 seconds, maybe your firewall is blocking it. Retrying using a tcp connection.
0:01:35.089757408     1 0x55c2ce502580 INFO                 rtspsrc gstrtspsrc.c:7788:gst_rtspsrc_retrieve_sdp:<src_elem0> Now using version: 1.0
0:01:36.135689541     1 0x55c2ce502580 INFO                 rtspsrc gstrtspsrc.c:3953:gst_rtspsrc_stream_configure_manager:<src_elem0> configure bandwidth in session 0x55c2cd8712b0
** INFO: <bus_callback:225>: Pipeline running

(添加最后一行是为了表明这是“预运行”场景。)

如果我尝试第二种情况,我会看到以下结果:

0:02:29.560067176     1 0x55c2ce502400 INFO                 rtspsrc gstrtspsrc.c:7788:gst_rtspsrc_retrieve_sdp:<src_elem1> Now using version: 1.0
0:02:30.612917137     1 0x55c2ce502400 INFO                 rtspsrc gstrtspsrc.c:3953:gst_rtspsrc_stream_configure_manager:<src_elem1> configure bandwidth in session 0x7f7c14031910
0:02:35.619949661     1 0x55c2ce502400 WARN                 rtspsrc gstrtspsrc.c:5769:gst_rtspsrc_reconnect:<src_elem1> warning: Could not receive any UDP packets for 5.0000 seconds, maybe your firewall is blocking it. Retrying using a tcp connection.
WARNING from src_elem1: Could not read from resource.
Debug info: gstrtspsrc.c(5769): gst_rtspsrc_reconnect (): /GstPipeline:pipeline/GstBin:multi_src_bin/GstBin:src_sub_bin1/GstRTSPSrc:src_elem1:
Could not receive any UDP packets for 5.0000 seconds, maybe your firewall is blocking it. Retrying using a tcp connection.
0:02:35.624850991     1 0x55c2ce502400 INFO                 rtspsrc gstrtspsrc.c:7788:gst_rtspsrc_retrieve_sdp:<src_elem1> Now using version: 1.0
0:02:36.672111985     1 0x55c2ce502400 INFO                 rtspsrc gstrtspsrc.c:3953:gst_rtspsrc_stream_configure_manager:<src_elem1> configure bandwidth in session 0x7f7c14031c50
...
0:03:03.195704059     1 0x7f7c0402c520 WARN                 rtspsrc gstrtspsrc.c:3458:on_timeout_common:<src_elem1> source 27578672, stream 27578672 in session 0 timed out

在研究这个问题时,我与 NVIDIA 的示例进行了比较:https://github.com/NVIDIA-AI-IOT/deepstream_reference_apps/blob/master/runtime_source_add_delete/deepstream_test_rt_src_add_del.c,据我所知,它并没有除了将元素的状态设置为

GST_STATE_PLAYING
之外,不要暂停管道或执行任何特殊操作,我也按照上面的说明进行操作。

在两种情况下,所有接收器/源/焊盘都以相同的方式创建/连接。

RTSP 流本身很好(事实上,它们位于同一台机器的本地)。

我绝不是 Gstreamer 专家,所以如果我做错了什么或遗漏了什么,我很高兴听到。如果有必要并且能够的话,我也很乐意提供更多详细信息。

提前谢谢您!

更新

我记得

GST_DEBUG_BIN_TO_DOT_*
宏/函数,并在运行时将其应用到我的管道中。我可以看到,尽管我尽了最大努力,但我的管道中仍然缺少流式传输所需的一些元素。如果我能够追查并纠正它,我将更新此问题并关闭它。

c gstreamer rtsp nvidia-deepstream
1个回答
0
投票

好吧,故事是这样的,我实际上已经具备了所有必要的元素;但是,我将错误的元素设置为

GST_STATE_PLAYING
。具体来说,当我应该设置该元素所在容器的状态时,我试图设置我有权访问的
GstRTSPSrc
元素的状态。

换句话说,

GstRTSPSrc
元素只是播放流所需的所有元素的一部分,并且这些元素包含在一个容器中。

如果我使用

GST_DEBUG_BIN_TO_*
功能并在正确的地方使用它,我会更快看到这一点。 (专业提示:结果图表的图例通常可以在左下角找到,这是一个很大的帮助。)

© www.soinside.com 2019 - 2024. All rights reserved.