感謝@otopolsky的輸入。 我不確定你對rtspsrc屬性的評論,因爲我使用的是rtmpsrc。
無論如何,我試圖按照您的想法將輸入流放入垃圾箱。 爲了我的演示代碼,我只做了一個輸入流,把所有的音頻放在一邊。
的管道如下:
rtmpsrc => decodebin => videoscale => videorate => capsfilter
=> compositor.sink_0 => capsfilter => x264enc => flvmux => rtmpsink
我生成bin一旦管道處於播放狀態,從而保證了倉動態添加到管道。 的集裝箱拿到了第二個輸入的所有元素:
rtmpsrc => decodebin => videoscale => videorate => capsfilter
我還設置一個鬼墊倉,關於這一點我用一個探頭,將做bin和管道之間的實際鏈接:
def _prob_block(self, pad, info, data):
pad.remove_probe(info.id)
src_pad = self.bin.get_static_pad('src')
sink_pad = self.compositor.get_request_pad('sink_1')
src_pad.link(sink_pad)
return Gst.PadProbeReturn.OK
ghost_pad = Gst.GhostPad.new('src', self.capsfilter_video_ben.get_static_pad('src'))
self.bin.add_pad(ghost_pad)
ghost_pad.add_probe(Gst.PadProbeType.BLOCK_DOWNSTREAM, self._prob_block, None)
然後,我有我的應用程序這個僞代碼:
def _activate_bin():
# ... this is where I create bin along with bin elements
# ... and create the ghost pad (see above)
# Then add the bin to the pipeline
pipe._pipeline.add(bin)
bin.set_state(Gst.State.PLAYING)
pipe = Pipeline()
GObject.timeout_add_seconds(10, _activate_bin)
pipe._pipeline.set_state(Gst.State.PLAYING)
這種近乎完美的作品,管道與一個輸入(sink_0),通過共同去啓動mpositor然後進入rtmpsink(我實際上可以播放輸出流)。 然後10秒鐘後,我將bin添加到管道(合成器的pad'sink_1')。這裏再一次,這工作完美無瑕,直到我有兩個輸入合成器。這是它開始凍結的地方。
從我能讀的,它可能來自延遲和/或時鐘,但我無法設法解決這個問題。 有趣的是,當我用兩個輸入流啓動管道時,我都沒有問題。
你有什麼想法爲什麼它有不同的行爲?
來源
2016-07-06 08:56:03
PLC