Неисправен трубопровод GStreamer с тройником, включающим две раковины

Попытка реализовать конвейер GStreamer с Tee, используя следующие элементы.

gst_bin_add_many(GST_BIN (pipeline), <rpicamsrc>, <capsfilter>, <h264parse>, tee, <queue>, <rtph264pay>, <fakesink>, <queue>, <avdec_h264>, <videoconvert>, <capsfilter>, <customplugin>, <fakesink>, nullptr);

Для лучшего понимания предоставлены имена элементов. Цель состоит в том, чтобы создать конвейер Tee следующим образом:

rpicamsrc ! capsfilter ! h264parse ! tee name=t t. ! queue ! rtph264pay ! fakesink t. ! queue ! avdec_h264 ! videoconvert ! capsfilter ! customplugin ! fakesink

Но он всегда терпит неудачу и не сообщает об ошибке. Но видео кадры не захватываются. После некоторого тестирования выявлено, что не удается даже для этого простого конвейера:

gst_element_link_many ( <rpicamsrc>, <capsfilter>, <h264parse>, <rtph264pay>, <fakesink>, nullptr))

Интересно, если я уберу второе fakesink из этого выше gst_bin_add_many строка кода это работает. Не уверен, в чем проблема с этим. Пробовал использовать другую раковину, как autovideosink, но не повезло. Когда это терпит неудачу, это не получает тип сообщения GST GST_MESSAGE_ASYNC_DONE в GST Bus, но для успеха дела это делает. Получает GST_STREAM_STATUS_TYPE_CREATE, GST_STREAM_STATUS_TYPE_ENTER а также GST_MESSAGE_STREAM_START как в случае неудачи, так и в случае успеха. Что я делаю не так, есть идеи?

0

Решение

gst_element_link_many() это удобная оболочка для неразветвленного конвейера, то есть она связывает один из следующего, следующий. Он не знает, что вы хотите связать элемент тройника в середине конвейера с несколькими элементами. Например, в вашем случае он пытается подключить fakesink к queue в середине вашего трубопровода.

Простой способ

Ты можешь использовать gst_parse_launch() позволить GStreamer выяснить, какие ссылки на что.

Своими руками

Если у вас есть такой элемент, как tee, вы должны использовать gst_element_link() или же gst_element_link_pads() сказать GSreamer, что к какому элементу подключиться.

Можно создать два конвейера с gst_element_link_many(),

rpicamsrc → capsfilter → h264parse → tee → queue → rtph264pay → fakesink

queue → avdec_h264 → videoconvert → capsfilter → customplugin→ fakesink

а затем, связать tee элемент выше к ниже с gst_element_link_pads(),

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]