Попытка реализовать конвейер 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 как в случае неудачи, так и в случае успеха. Что я делаю не так, есть идеи?
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()
,
Других решений пока нет …