2017-12-20 8 views
2

Ich erstelle einen Prozess, in dem Python eine Videodatei öffnet und sie in die Standardeingabe eines ffmpeg-Befehls streamt. Ich denke, ich habe die richtige Idee, aber die Art, wie die Datei geöffnet wird, funktioniert nicht mit Stdin. Hier ist mein Code so weit:streamen Videodatei als Bytes in Stddin

def create_pipe(): 

    return Popen([ 'ffmpeg', 
         '-loglevel', 'panic', 
         '-s', '1920x1080', 
         '-pix_fmt', 'yuvj420p', 
         '-y', 
         '-f', 'image2pipe', 
         '-vcodec', 'mjpeg', 
         '-r', self.fps, 
         '-i', '-', 
         '-r', self.fps, 
         '-s', '1920x1080', 
         '-f', 'mov', 
         '-vcodec', 'prores', 
         '-profile:v', '3', 
         '-aspect', '16:9', '-y', 
         'output_file_name' + '.mov'], stdin=PIPE) 



in_pipe = create_pipe() 
with open("~/Desktop/IMG_1973.mov", "rb") as f: 
    in_pipe.communicate(input=f) 

Dies ergibt den Fehler:

TypeError: a bytes-like object is required, not '_io.BufferedReader'

Was wäre der richtige Weg sein/zu öffnen, eine Videodatei in dieses Rohr streamen? Ich muss auch ein Stream sein, anstatt das Ganze in Erinnerung zu behalten.

PS. bitte ignoriere, dass ich die Datei in ffmpeg nativ öffnen könnte ... Ich erstelle einen Wrapper, und es ist besser, wenn ich die Eingabe steuern kann.

Antwort

1

Stellen Sie zuerst sicher, dass das Eingabeformat weitergeleitet werden kann. Für ISO BMFF muss das moov Atom am Anfang der Datei sein, damit dies funktioniert.

Wenn es pipeable ist dann ein generator verwenden, um die Datei und eine Pipe an die Subprozess zu lesen:

def read_bytes(input_file, read_size=8192): 
    """ read 'read_size' bytes at once """ 
    while True: 
     bytes_ = input_file.read(read_size) 
     if not bytes_: 
      break 
     yield bytes_ 


def main(): 
    in_pipe = create_pipe() 

    with open("in.mov", "rb") as f: 
     for bytes_ in read_bytes(f): 
      in_pipe.stdin.write(bytes_) 

    in_pipe.stdin.close() 
    in_pipe.wait() 
Verwandte Themen