Python 使用具有两个接收器的交错元素时Gst管道未运行
我在gstreamer管道中使用interleave元素时遇到问题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',
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元素后面有一个队列,所以我不太确定之前如何添加它