Поток RTSP не запускается/истечет время ожидания при добавлении rtspsrc в работающий конвейер Gstreamer

У меня есть конвейер Gstreamer (основанный на эталонной реализации NVIDIA «deepstream-app»), который будет успешно воспроизводить потоки RTSP с использованием rtspsrc при запуске.

Однако, если я попытаюсь вместо этого добавить те же самые потоки после запуска конвейера (скажем, через минуту или две), поток не запустится и, похоже, истечет время ожидания.

Я вполне уверен, что использую один и тот же код в обоих сценариях (т. е. запуск перед конвейером и запуск после конвейера), за единственным исключением: последний сценарий имеет явный вызов для установки состояния элемента в GST_STATE_PLAYING, что завершается успешно. :

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

Я пробовал различные уровни вывода журнала (вплоть до DEBUG), и, похоже, ничего особенного не выдалось.

Если установлено значение 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_* и применил их к своему конвейеру во время выполнения. Я вижу, что, несмотря на все мои усилия, мне не хватает некоторых элементов, необходимых для потоковой передачи. Если я смогу найти его и исправить, я обновлю этот вопрос и закрою его.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
208
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Итак, история гласит, что у меня действительно были все необходимые элементы; однако я установил неправильный элемент GST_STATE_PLAYING. В частности, я пытался установить состояние элемента GstRTSPSrc, к которому у меня был доступ, тогда как мне следовало устанавливать состояние контейнера, в котором находится этот элемент.

Другими словами, элемент GstRTSPSrc — это лишь часть всех элементов, необходимых для воспроизведения потока, и эти элементы содержатся в контейнере.

Я бы увидел это раньше, если бы использовал функцию GST_DEBUG_BIN_TO_* И использовал ее в нужном месте. (Совет для профессионалов: легенду получившейся диаграммы обычно можно найти в левом нижнем углу, и это очень помогает.)

Другие вопросы по теме