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





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