Невозможно получить gstreamer UDP Stream от OpenCV Gstreamer - PullRequest
1 голос
/ 08 ноября 2019

Я работаю над Gazebo Sim, который использует плагин Gstreamer для потоковой передачи видео с камеры через UDP. Симуляция запущена в Ubuntu 18.04.

Существуют некоторые ресурсы для понимания бэкенда этой структуры. Руководство по Gazebo Simulation PX4

И они упоминают, как создать конвейер:

Видео из Gazebo должно отображаться в QGroundControl так же, как с реальной камеры.

Видео также можно просматривать с помощью конвейера Gstreamer. Просто введите следующую команду терминала:

gst-launch-1.0  -v udpsrc port=5600 caps='application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264' \
! rtph264depay ! avdec_h264 ! videoconvert ! autovideosink fps-update-interval=1000 sync=false

И она хорошо работает на терминале. Я прочитал эти вопросы:

использование gstreamer с python opencv для захвата живого потока?

Запись в конвейер Gstreamer из opencv в python

Итак, я попытался внедрить этот конвейер в opencv, используя следующие строки:

video = cv2.VideoCapture('udpsrc port=5600 caps = "application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264" ! rtph264depay ! avdec_h264 ! videoconvert ! autovideosink fps-update-interval=1000 sync=false', cv2.CAP_GSTREAMER)
    #video.set(cv2.CAP_PROP_BUFFERSIZE,3)
    # Exit if video not opened.
    if not video.isOpened():
        print("Could not open video")
        sys.exit()

    # Read first frame.
    ok, frame = video.read()
    if not ok:
        print('Cannot read video file')
        sys.exit()

Но выдает только ошибку:

Не удалось открыть видео

И я пробовал разные варианты этого конвейера в opencv, но ни один из них мне не помог.

1 Ответ

0 голосов
/ 11 ноября 2019

В настоящее время ваш конвейер не позволяет OpenCV извлекать декодированные видеокадры из конвейера. Это связано с тем, что в конце все кадры идут к элементу autovideosink, который обеспечивает отображение кадров на экране. Вместо этого вы должны использовать элемент appsink, который сделан специально для того, чтобы приложения могли получать видеокадры из конвейера.

video = cv2.VideoCapture(
    'udpsrc port=5600 caps = "application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264"'
    ' ! rtph264depay'
    ' ! avdec_h264'
    ' ! videoconvert'
    ' ! appsink', cv2.CAP_GSTREAMER)
...