Почему gStreamer выдает ошибку из waylandsink?

Я работаю над проектом Smart Birdfeeder (https://github.com/google-coral/project-birdfeeder) При запуске birdfeeder.sh с камерой Coral на доске разработчиков я получаю:

** (python3: 3933): КРИТИЧЕСКИЙ **: 16: 37: 50.961: Не удалось очистить соединение Wayland

Ошибка перетекает в окно терминала и подавляет вывод до тех пор, пока I ^ Z не выйдет из программы. Число, следующее за «python3:», является постоянным для данного запуска, но будет другим для разных запусков. Если я подключаю видеомонитор к разъему HDMI на плате и запускаю программу, изображение с камеры в реальном времени отображается на мониторе, и если я держу фотографию птицы перед камерой, программа работает и изображение с камеры сохраняется, и правильная идентификация птицы записывается в файл журнала. Вот код конвейера:

def run_pipeline(user_function,
                     src_size=(640,480),
                     appsink_size=(320, 180)):
        PIPELINE = 'v4l2src device=/dev/video0 ! {src_caps} ! {leaky_q}  ! tee name=t'
        if detectCoralDevBoard():

        # Test framerate of 1/1 on 200212 (line 69), then 10/1 back to 30/1

            SRC_CAPS = 'video/x-raw,format=YUY2,width={width},height={height},framerate=30/1'
            PIPELINE += """
                t. ! {leaky_q} ! glupload ! glfilterbin filter=glcolorscale
                   ! {dl_caps} ! videoconvert ! {sink_caps} ! {sink_element}
                t. ! {leaky_q} ! glupload ! glfilterbin filter=glcolorscale
                   ! rsvgoverlay name=overlay ! waylandsink
            """

У меня нет опыта работы с gstreamer, и мне пригодится любая помощь. Спасибо.


person Desertgeek    schedule 04.03.2020    source источник


Ответы (2)


Для всех, кто пытается запустить GStreamer на Coral Dev-Board в автономном режиме и без активного сеанса терминала (зарегистрированного как служба Systemd или что-то подобное). Есть один плохой хак, который я нашел (и который теперь аналогичным образом включен в новый пример кода Coral):

os.environ["XDG_RUNTIME_DIR"] = "/run/user/1000"

Поместите это в код Python, в котором вы собираете конвейер GStreamer.

Еще одна вещь, которую я видел в некотором коде Google раньше, - это введение сообщений в шину gstreamer, чтобы удовлетворить один элемент, который запрашивает текущий дисплей.

person Florian Hermisch    schedule 21.04.2020

Хороший вопрос НО я не знаком с программой и у меня нет монитора на коралловой доске. Однако вот несколько идей для начала. Я только начинаю знакомиться с gstreamer (GST) и думаю, что это довольно круто!

  1. Строка PIPELINE подается в анализатор GST для построения потока данных обработки. Каждый шаг конвейера отделен знаком (!) И может быть либо плагином, либо внутренней возможностью. Конвейер в этом примере довольно сложен, и я подозреваю, что в некоторых шагах нет необходимости. Похоже, что здесь один источник - коралловая камера и две раковины. Каждая ссылка на t. является новым потоком обработки: одна идет к {sink_element} (которая является строкой, определенной где-то в скрипте python), а другая идет к waylandsink. Элементы между источником и приемником принимают приемник предыдущего элемента в конвейере в качестве источника и выполняют какое-то преобразование. Например, плагин videoconvert часто используется для волшебного преобразования исходного видеосигнала в сигнал, который может потребляться приемником. glupload - это плагин opengl, который преобразует видео в шейдинг opengl (я не понимаю, нужно ли это). Я не узнаю некоторые другие плагины.

  2. Я предполагаю, что плагин waylandsink выдает вашу ошибку. Вы можете просмотреть документы по адресу waylandsink. Возможно, вам придется взглянуть на исходный код C, чтобы понять, почему он генерирует КРИТИЧЕСКУЮ ошибку, но если видео отображается на локальном мониторе, оно не должно быть КРИТИЧЕСКИМ.

  3. Номер NNN в строке python3:NNN - это идентификатор процесса потока Python. Возможно, для вас это не имеет значения, но GST сильно многопоточен, поэтому полезен для отладки.

Удачи!

person dturvene    schedule 11.03.2020
comment
Большое спасибо за ответ. - person Desertgeek; 12.03.2020
comment
Расследование началось несколько месяцев назад, во время которого я собрал воедино многое из того, что вы сказали выше в №1. Конвейер должен подготавливать INPUT к механизму вывода TensorFlow. Одно должно быть изображение 320x180, но я не уверен, что это за второе. Я укоренился в № 2, пытаясь понять, что злит Wayland, когда к нему не прикреплен монитор. Когда он будет развернут, его НЕ будет. - person Desertgeek; 12.03.2020
comment
PS: №3 был ОЧЕНЬ информативным. Я не опытный программист на Python, но программировал на нескольких других языках. - person Desertgeek; 12.03.2020
comment
Понятно. Да, первый поток - это само изображение. Второй - это наложение rsvg (google it), основанное на обнаружении объекта TPU, возможно, ограничивающая рамка и текст для обнаруженного объекта. Wayland - это оконный менеджер, которому нужен графический интерфейс. - person dturvene; 14.03.2020
comment
Понятно. Wayland - это оконный менеджер, которому нужен графический интерфейс. Я подозреваю, что отсутствие вывода на дисплей вызывает критическую ошибку. Если нет сигнала HDMI, вам необходимо передать поток на удаленную систему. Используйте конверт RTSP и udpsink для потоковой передачи; udpsrc для получения на удаленном сервере. Множество примеров, как это сделать в сети. - person dturvene; 14.03.2020
comment
Этот код предоставляется как часть онлайн-проекта Smart Birdfeeder для Coral Dev Board и камеры. Он предназначен для использования на открытом воздухе. Странно, что в коде будет использоваться элемент GStream, требующий монитора. - person Desertgeek; 15.03.2020
comment
да. Большая часть их демонстрационного кода довольно грубая. Я думаю, они изо всех сил пытались выпустить продукт. У меня аналогичное требование; Я использую видеостример RTP на целевом объекте (! rtp263pay ! udpsink host=<ip>), а затем читаю и декодирую на удаленном конце для отображения видео. - person dturvene; 19.03.2020