GStreamer:动态移除混合器src元件冻结管道

GStreamer:动态移除混合器src元件冻结管道,gstreamer,vala,Gstreamer,Vala,我尝试使用gstaudiomixer从我动态添加和删除的两个源元素混合音频 +---------+ +------------+ | source1 |--->| | +---------+ | | +-----------+ | audiomixer |--->| audiosink | +---------+ | | +-----------+ | sou

我尝试使用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);
}
这是我的第二次尝试,试图阻止pad:

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;
    });
}

正确的方法是什么?

如果要从管道中更改或删除元素,请确保停止向元素推送缓冲区,向元素发送eos并添加新的eos,然后继续。这是很好的解释