Danke @otopolsky für die Eingabe. Ich bin mir nicht sicher über Ihre Kommentare zu Eigenschaften von rtspsrc, da ich rtmpsrc verwende.
Wie auch immer, ich habe versucht, Ihrer Idee zu folgen, Eingabestreams in Bins zu setzen. Um meines Demo-Codes willen, habe ich es nur für einen Input-Stream gemacht, mit all den Audio-Sachen beiseite gelegt.
Die Pipeline ist wie folgt:
rtmpsrc => decodebin => videoscale => videorate => capsfilter
=> compositor.sink_0 => capsfilter => x264enc => flvmux => rtmpsink
ich bin bauen, sobald die Pipeline im Spielzustand befindet, also der Behälter, um sicherzustellen, dynamisch an die Pipeline hinzugefügt wird. Der Behälter hat alle Elemente des zweiten Eingangs:
rtmpsrc => decodebin => videoscale => videorate => capsfilter
ich Setup auch ein Geist-Pad für die bin, an dem ich eine Sonde verwenden, die die eigentliche Verbindung zwischen dem Behälter tun wird und die Pipeline:
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)
Dann habe ich diese Pseudo-Code für meine Anwendung:
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)
Diese fast fehlerlos arbeitet, beginnt die Pipeline mit einem Eingang (sink_0), die durch die Zusammenarbeit geht mpositor und dann in rtmpsink (ich kann tatsächlich den Ausgangsstrom spielen). Dann 10 Sekunden später, ich füge die Bin der Pipeline (Pad 'Senke_1' des Compositor). Auch hier funktioniert das einwandfrei, bis ich beide Eingaben in den Compositor bekommen habe. Hier fängt es an zu frieren.
Von dem, was ich lesen konnte, könnte es von Latenzen und/oder Uhren kommen, aber ich konnte das Problem nicht beheben. Die interessante Sache zu beachten ist, dass ich das Problem nicht habe, wenn ich die Pipeline mit beiden Eingabeströmen starte.
Hätten Sie eine Idee, warum es ein anderes Verhalten hat?