ich habe zwei subprocesse die ich gerne über stdout und stdin Verbinden möchte. Der Quell Prozess läuft in einem Thread und verarbeitet Videodateien nacheinander. Der Zielprozess läuft im Mainthread und soll, im Gegensatz zum Quellprozess konstant bestehen bleiben.
Verbinden tue ich die beiden mit einer Queue. Das ganze schaut dann in etwa so aus (ist noch ziemlich WIP):
Code: Alles auswählen
# independent thread for clip preparation
def play_clips(buffer, GetSourceIter):
get_source = GetSourceIter()
for src_cmd in get_source.next():
try:
decoder = Popen([
'ffmpeg', '-hide_banner', '-nostats'
] + src_cmd + ['-pix_fmt', 'yuv420p', '-r', '25',
'-c:v', 'mpeg2video', '-intra', '-q:v', '2',
'-c:a', 's302m', '-strict', '-2', '-ar', '48000', '-ac', '2',
'-threads', '2', '-f', 'mpegts', '-'], stdout=PIPE)
for data in iter(decoder.stdout.readline, ''):
if not data:
break
buffer.put(data)
finally:
decoder.wait()
else:
buffer.put(None)
def main():
buffer = Queue(maxsize=120)
try:
playout = Popen([
'ffplay',
'-hide_banner', '-nostats', '-i', 'pipe:0'],
stderr=None,
stdin=PIPE,
stdout=None
)
play_thread = Thread(
name='play_clips', target=play_clips, args=(
buffer, GetSourceIter,)
)
play_thread.daemon = True
play_thread.start()
while True:
data = buffer.get()
if not data:
playout.terminate()
break
playout.stdin.write(data)
finally:
playout.wait()
Dazu kommt auch, dass beim Quellprozess einen MPEG-TS Stream erzeugt wird und dieser sollte exakt 188 Byte große Pakete schicken, mir scheint aber dass die Pakete die in der Queue landen unterschiedlich groß sind. Ist jetzt nur eine Vermutung, aber wenn ich die Startzeit mit der Länge der einzelnen Videoclips aufrechnen und mir die Differenzen ausgeben lassen, bekomme ich nicht exakte Ergebnisse, die sich von Clip zu Clip unterscheiden.