Почему gStreamer выдает ошибку из waylandsink? - PullRequest
1 голос
/ 04 марта 2020

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

** ( python3: 3933): КРИТИЧЕСКИЙ **: 16: 37: 50.961: Сбой при гриппе sh Соединение 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 и могу использовать любую помощь. Спасибо.

Ответы [ 2 ]

1 голос
/ 11 марта 2020

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

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

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

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

Удачи!

0 голосов
/ 21 апреля 2020

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

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

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

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

...