robux
@robux
бородат

Gstreamer: можно ли соединить два Pipeline'а?

Один Pipeline состоит из элементов.
Всё хорошо когда элементы набиты в один пайплайн.

Но если я хочу два или три пайплайна соединить?

Например на первый повесить веб-камеру, тройник, кодировщик vp8,
на второй пайплан — маленкий дисплей,
а на третий — еще один дисплей.
Потом как-то соединить эти три пайплайна.
При этом иметь возможность ставить некоторые на паузу.

Такое возможно?
Или придется всё-таки пихать всё в один пайлайн?
А при добавлении-удалении элементов перетряхивать весь пайплайн?
Научите как правильно.

Схема примерно такая:
  • Вопрос задан
  • 3427 просмотров
Пригласить эксперта
Ответы на вопрос 2
robux
@robux Автор вопроса
бородат
Ну хорошо, упрощу вопрос:
можно ли хотя бы приостановить одну ветку после tee?

Т.е. чтобы поток данных в эту ветку не шёл. Что-то типа паузы.
Но пауза не на весь пайплайн, а на его отдельную ветку, м?
Ответ написан
@nickpetrovsky
Можно и не упрощая :), динамически создавайте новый pad у tee, и добавляйте ветку из созданных элементов.
Перед редактированием как основная последовательность, так и подключаемая должны быть в состоянии паузы.

Примерный код добавления бранча:
GstElement *pipeline, *branch;
// Положим, что все элементы созданы и связи между ними настроены
// (pipeline не связан и не содержит в себе branch)
gst_element_set_state (pipeline, GST_STATE_PAUSED);
gst_element_set_state (branch, GST_STATE_PAUSED);
// Запросим pad из основной последовательности, и приёмник из branch
tee_queue1_pad = gst_element_get_request_pad (tee, "src%d");
queue1_queue_pad = gst_element_get_pad (branch, "videosink");
// Настроим связи
gst_bin_add(GST_BIN(pipeline), muxbranch);
gst_pad_link(tee_queue1_pad, queue1_queue_pad);
// Вернём к проигрыванию
gst_element_set_state (branch, GST_STATE_PLAYING);
gst_element_set_state (pipeline, GST_STATE_PLAYING);
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы