0

Я работаю над скриптом Python, запущенным на RPi3, и используя gstreamer для подключения к RTSP-каналу моей IP-камеры и обслуживаю декодированные кадры H264 для моего сценария Python.Перезапуск GStreamer Pipeline в Python на EOS

Вот gstreamear трубопровод используется, чтобы получить кадры с камеры:

rtspsrc location=rtsp://ip:port/path ! rtph264depay ! h264parse ! decodebin ! videoconvert ! video/x-raw, format=BGR ! appsink name=sink 

Проблема: Поскольку камера на медленном/недостоверное подключении к Интернету, я получаю сброшенные кадры каждый сейчас и потом, что приводит к генерируемый сигнал EOS. Пропускная способность интернет-соединения может быть проблемой, иногда вызывающей зависание с потоком.

Цель: На сигнале EOS я хотел бы перезапустить конвейер, так что gstreamer может поддерживать сервисные рамки в моей программе.

То, что я пробовал: У меня есть функция обратного вызова, прикрепленную к шине, который прослушивает для сообщений с помощью

bus.connect("message", on_message) 

Внутри «ON_MESSAGE» функции, я могу успешно определить, является ли сообщение сигнал EOS. Если я обнаружу сигнал EOS, я попытаюсь перезапустить трубопровод, выполнив:

pipline.set_state(Gst.State.NULL) 
pipline.set_state(Gst.State.PAUSED) 
pipline.set_state(Gst.State.PLAYING) 

К сожалению, это не сработает. Как только мой scipt пытается перезапустить конвейер, используя вышеприведенный фрагмент, я получаю следующие ошибки, появляющиеся на шине. И я знаю, что камера в сети, так что это не проблема.

('ERROR!!!:', 'source', '!:!', 'Could not read from resource.') 
('Debug info:', 'gstrtspsrc.c(5583): gst_rtspsrc_send(): /GstPipeline:pipeline0/GstRTSPSrc:source:\nGot error response: 400 (Bad Request).') 
('ERROR!!!:', 'source', '!:!', 'Could not write to resource.') 
('Debug info:', 'gstrtspsrc.c(6933): gst_rtspsrc_close(): /GstPipeline:pipeline0/GstRTSPSrc:source:\nCould not send message. (Generic error)') 
('ERROR!!!:', 'udpsrc2', '!:!', 'Internal data stream error.') 
('Debug info:', 'gstbasesrc.c(2951): gst_base_src_loop(): /GstPipeline:pipeline0/GstRTSPSrc:source/GstUDPSrc:udpsrc2:\nstreaming stopped, reason not-linked (-1)') 

В случае проблема была с rtspsrc, я также попытался с помощью короткого локального видео с помощью filesrc, и используя сигнал EOS генерируемое при GStreamer достигает конца видеофайла, чтобы проверить, могу ли я в состоянии перезапустить трубопровод , Вот пример трубопровода я играл местное видео:

filesrc location=file.mp4 ! qtdemux ! decodebin ! videoconvert ! video/x-raw, format=BGR ! appsink name=sink 

Если он успешен, он должен начать снова идти через видео, но не повезло ... Вместо этого я не буду получать следующее сообщение об ошибке, что делает меня подумайте, что filesrc как-то нужно сбросить. То же самое на примере RTSP, где есть ошибка, генерируемая rtspsrc

('ERROR!!!:', 'qtdemux0', '!:!', 'Internal data stream error.') 
('Debug info:', 'qtdemux.c(5847): gst_qtdemux_loop(): /GstPipeline:pipeline0/GstQTDemux:qtdemux0:\nstreaming stopped, reason not-linked (-1)') 

Кто-нибудь может пролить свет на эту проблему? Благодаря!

+0

Вы создаете свой трубопровод с помощью gst_parse_launch или аналогичного? – thiagoss

ответ

0

Когда вы

pipline.set_state (Gst.State.NULL)

это вовсе не означает, что трубопровод немедленно достиг этого состояния. Чтобы вы могли вызвать pipe.get_state(). Также я предлагаю обработать возвращаемые значения для set_state(). Наконец, чтобы вернуться к игре, нет необходимости сначала переходить к PAUSED (если вы не хотите делать что-то между PUASED и PLAYING).

+0

Итак, я добавил в некоторый код отладки для печати состояния конвейера в командной строке в определенные моменты. Когда выдается EOS, трубопровод все еще находится в состоянии 'PLAYING'. Затем я могу ввести его в состояние «READY», а затем в состояние «NULL». Чтобы вернуть конвейер, я вернул конвейер в 'READY' (подтвердите, что он готов, используя' get_state() '). Но когда я пытаюсь вернуть его в 'PLAYING' или' PAUSED', я получаю ту же ошибку, что и раньше: 'qtdemux.c (5847): gst_qtdemux_loop():/GstPipeline: pipe0/GstQTDemux: qtdemux0: \ nstreaming остановлено, причина не связана (-1) ' –

+0

Когда я использую свой источник RTSP вместо локального воспроизведения видео, я получаю очень похожую ошибку , за исключением этого времени от 'rtspsrc', а не' qtdemux'. '' gstbasesrc.c (2951): gst_base_src_loop():/GstPipeline: pipe0/GstRTSPSrc: source/GstUDPSrc: udpsrc2: \ nstreaming остановлено, причина не связана (-1) '' –

+0

Хм, не связанный с qtdemux сообщает что она не проходит через ту же инициализацию при повторном использовании, как если бы она была новой. Это может быть ошибка. Если вы воссоздаете конвейер на EOS, и он работает, это подтвердит его. Можете ли вы указать ошибку для gstreamer и добавить свой образец python. – ensonic

Смежные вопросы