GStreamer: динамическое удаление элемента src микшера останавливает конвейер - PullRequest
0 голосов
/ 06 июня 2018

Я пытаюсь микшировать аудио, используя gstaudiomixer из двух исходных элементов, которые я динамически добавляю и удаляю.

+---------+    +------------+
| source1 |--->|            |
+---------+    |            |    +-----------+
               | audiomixer |--->| audiosink |
+---------+    |            |    +-----------+
| source2 |--->|            |
+---------+    +------------+

Динамическое добавление элементов (с использованием пэдов и шаблонов пэдов), кажется, работает как задумано.Однако, когда динамическое удаление пэда приводит к зависанию конвейера.

Этот код я использовал для удаления элемента:

public void remove(Gst.Element? element)
{
    /* Removes the element from the pipeline */
    if (element == null) return;

    element.set_state(Gst.State.NULL);  // Stop it from streaming data
    element.unlink(this.mixer);
    this.pipeline.remove(element);
}

Это моя вторая попытка блокировать пэд:

public void remove(Gst.Element? element)
{
    /* Removes the element from the pipeline */
    if (element == null) return;

    element.get_static_pad("src").get_peer().add_probe(Gst.PadProbeType.IDLE, (pad, info) => {
        element.set_state(Gst.State.NULL);  // Stop it from streaming data
        element.unlink(this.mixer);
        this.pipeline.remove(element);
        return Gst.PadProbeReturn.REMOVE;
    });
}

Как правильно это сделать?

1 Ответ

0 голосов
/ 07 июня 2018

Если вы хотите изменить или удалить элемент из конвейера, убедитесь, что вы прекратили помещать буферы в элемент, отправили eos элементу, добавили новый и продолжили.Это хорошо объяснено в этой ссылке

...