2017-01-12 11 views
0

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

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

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

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-launch на терминале, установите GST_DEBUG = 4, чтобы получить журнал. – cxphong

ответ

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().