使用带两个接收器的interleave元素时,Gst管道未运行

时间:2017-07-16 11:39:34

标签: python gstreamer

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

我正在将输入(autoaudiosrc)中的音频读入发球台,这样我就可以将它写入磁盘并实时获取音频电平(用它来输入硬件vu表,在附带的片段中打印出来) stdout的水平)。我想能够使用任何1或2个通道并将它们写入单独的文件,这样我就可以将6个输入通道分成5个文件(1个立体声,4个单声道)。 现在将所有内容写入一个文件工作正常,然后我添加了一个deinterleave元素将所有内容拆分为单个文件,这些文件也工作正常,但将两个通道组合成一个立体声通道会破坏整个管道。

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)时,文件会被创建但管道似乎卡住了。既没有打印出关卡,也没有将数据写入文件。

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

https://gist.github.com/maxjoehnk/16785499db6e864bf120cf85a81b1ecf

1 个答案:

答案 0 :(得分:0)

好的,所以Florian Zwoch的评论是线索。我已经为每个频道添加了一个队列,现在一切正常。所以我的new_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

这不是特别干净,但似乎工作正常,所以现在我会坚持下去。