Python 使用具有两个接收器的交错元素时Gst管道未运行

Python 使用具有两个接收器的交错元素时Gst管道未运行,python,gstreamer,Python,Gstreamer,我在gstreamer管道中使用interleave元素时遇到问题 def new_recorder_bin(path, sinks=1): bin = Gst.Bin() interleave = Gst.ElementFactory.make('interleave', None) queue = Gst.ElementFactory.make('queue', None) encoder = Gst.ElementFactory.make('wavenc',

我在gstreamer管道中使用interleave元素时遇到问题

def new_recorder_bin(path, sinks=1):
    bin = Gst.Bin()
    interleave = Gst.ElementFactory.make('interleave', None)
    queue = Gst.ElementFactory.make('queue', None)
    encoder = Gst.ElementFactory.make('wavenc', None)
    output = Gst.ElementFactory.make('filesink', None)
    output.set_property('location', path)
    bin.add(interleave)
    bin.add(queue)
    bin.add(encoder)
    bin.add(output)
    interleave.link(queue)
    queue.link(encoder)
    encoder.link(output)
    if sinks == 1:
        interleave.set_property('channel_positions', [GstAudio.AudioChannelPosition.MONO])
        sink = interleave.get_request_pad('sink_0')
        ghostpad = Gst.GhostPad.new('sink_0', sink)
        bin.add_pad(ghostpad)
    elif sinks == 2:
        interleave.set_property('channel_positions', [
            GstAudio.AudioChannelPosition.FRONT_LEFT,
            GstAudio.AudioChannelPosition.FRONT_RIGHT
        ])
        sink0 = interleave.get_request_pad('sink_0')
        ghostpad0 = Gst.GhostPad.new('sink_0', sink0)
        sink1 = interleave.get_request_pad('sink_1')
        ghostpad1 = Gst.GhostPad.new('sink_1', sink1)
        bin.add_pad(ghostpad0)
        bin.add_pad(ghostpad1)
    return bin
我将音频从一个输入(autoaudiosrc)读入一个tee,这样我就可以将其写入磁盘并实时获取音频电平(将其输入一个硬件vu表,在附加的代码片段中,它只是将电平打印到标准输出)。我想能够使用任何1或2个通道,并将它们写入一个单独的文件,以便我能够将6个输入通道拆分为5个文件(1个立体声,4个单声道)。 现在,将所有内容写入一个文件很好,然后我添加了一个解交错元素,将所有内容拆分为单声道文件,这也很好,但是将两个声道合并为一个立体声声道会破坏整个管道

def new_recorder_bin(path, sinks=1):
    bin = Gst.Bin()
    interleave = Gst.ElementFactory.make('interleave', None)
    queue = Gst.ElementFactory.make('queue', None)
    encoder = Gst.ElementFactory.make('wavenc', None)
    output = Gst.ElementFactory.make('filesink', None)
    output.set_property('location', path)
    bin.add(interleave)
    bin.add(queue)
    bin.add(encoder)
    bin.add(output)
    interleave.link(queue)
    queue.link(encoder)
    encoder.link(output)
    if sinks == 1:
        interleave.set_property('channel_positions', [GstAudio.AudioChannelPosition.MONO])
        sink = interleave.get_request_pad('sink_0')
        ghostpad = Gst.GhostPad.new('sink_0', sink)
        bin.add_pad(ghostpad)
    elif sinks == 2:
        interleave.set_property('channel_positions', [
            GstAudio.AudioChannelPosition.FRONT_LEFT,
            GstAudio.AudioChannelPosition.FRONT_RIGHT
        ])
        sink0 = interleave.get_request_pad('sink_0')
        ghostpad0 = Gst.GhostPad.new('sink_0', sink0)
        sink1 = interleave.get_request_pad('sink_1')
        ghostpad1 = Gst.GhostPad.new('sink_1', sink1)
        bin.add_pad(ghostpad0)
        bin.add_pad(ghostpad1)
    return bin
这是创建一个新bin以将一个或两个通道写入磁盘的代码。当我只连接到一个水槽垫(并将水槽设置为1)时,一切仍然正常,但当我连接两个水槽垫(并将水槽设置为2)时,文件会创建,但管道似乎卡住了。既不会打印级别,也不会将数据写入文件

我已经在一个要点中附上了完整的文件,这是原型代码,但在我重构它之前,我希望一切都能正常工作

好的,那么作者的评论就是线索。我已经为每个频道添加了一个队列,现在一切正常。因此,我的新_recorder_bin函数现在如下所示:

def new_recorder_bin(path, sinks=1):
    bin = Gst.Bin()
    interleave = Gst.ElementFactory.make('interleave', None)
    encoder = Gst.ElementFactory.make('wavenc', None)
    output = Gst.ElementFactory.make('filesink', None)
    output.set_property('location', path)
    bin.add(interleave)
    bin.add(encoder)
    bin.add(output)
    interleave.link(encoder)
    encoder.link(output)
    if sinks == 1:
        queue = Gst.ElementFactory.make('queue', None)
        bin.add(queue)
        interleave.set_property('channel_positions', [GstAudio.AudioChannelPosition.MONO])
        sink = interleave.get_request_pad('sink_0')
        queueSink = queue.get_static_pad('sink')
        queueSrc = queue.get_static_pad('src')
        queueSrc.link(sink)
        ghostpad = Gst.GhostPad.new('sink_0', queueSink)
        bin.add_pad(ghostpad)
    elif sinks == 2:
        queue0 = Gst.ElementFactory.make('queue', 'Queue L')
        queue1 = Gst.ElementFactory.make('queue', 'Queue R')
        bin.add(queue0)
        bin.add(queue1)
        interleave.set_property('channel_positions', [
            GstAudio.AudioChannelPosition.FRONT_LEFT,
            GstAudio.AudioChannelPosition.FRONT_RIGHT
        ])
        sink0 = interleave.get_request_pad('sink_0')
        queueSink0 = queue0.get_static_pad('sink')
        queueSrc0 = queue0.get_static_pad('src')
        queueSrc0.link(sink0)
        ghostpad0 = Gst.GhostPad.new('sink_0', queueSink0)
        sink1 = interleave.get_request_pad('sink_1')
        queueSink1 = queue1.get_static_pad('sink')
        queueSrc1 = queue1.get_static_pad('src')
        queueSrc1.link(sink1)
        ghostpad1 = Gst.GhostPad.new('sink_1', queueSink1)
        bin.add_pad(ghostpad0)
        bin.add_pad(ghostpad1)
    return bin

这并不是特别干净,但似乎很好用,所以现在我将坚持使用它。

不确定整个管道的外观。但是由于您的所有音频都来自同一个线程(相同的音频源)。我希望interleave元素会阻止自己。尝试在交错接收板之前添加队列元素。现在我有一个T形三通,它将信号“拆分”为两个队列,一个用于级别元素,另一个用于解交错元素。完整管道的源代码可以在我链接的要点中找到。我真的需要为每个pad或每个元素添加一个队列吗?因为我在interleave元素后面有一个队列,所以我不太确定之前如何添加它