Я работаю над скриптом 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)')
Кто-нибудь может пролить свет на эту проблему? Благодаря!
Вы создаете свой трубопровод с помощью gst_parse_launch или аналогичного? – thiagoss