FFMPEG- und Pythons-Subprozess

8

Ich versuche eine Gui für FFMPEG zu schreiben. Ich benutze Pythons Subprozess, um einen ffmpeg-Prozess für jede gewünschte Konvertierung zu erstellen. Das funktioniert gut, aber ich möchte auch einen Weg, um den Fortschritt der Konvertierung zu erhalten, ob es fehlgeschlagen ist oder nicht usw. Ich dachte, ich könnte dies tun, indem ich wie folgt auf das stdout des Prozesses zugreife:

Aufruf von subprocess.Popen()

%Vor%

Und lesen stdout :

%Vor%

Das funktioniert aber, der Status von ffmpeg wird nicht angezeigt. Ich gehe davon aus, dass es etwas damit zu tun hat, wie ffmpeg es auffrischt. Gibt es eine Möglichkeit, darauf zuzugreifen?

    
voyager 21.09.2009, 16:49
quelle

6 Antworten

8

Ich habe oft Probleme beim Lesen der Standardausgabe (oder sogar des Standardfehlers!) mit Subprozess bemerkt, aufgrund von Pufferproblemen, die schwer zu überwinden sind. Meine Lieblingslösung, wenn ich solche stdout / stderr aus dem Subprozess lesen muss, ist die Verwendung von subprocess , pexpect (oder unter Windows wexpect ).

    
Alex Martelli 21.09.2009, 17:26
quelle
5

Fügen Sie einfach hinzu, universal_newlines = True zu Ihrer Subprozess.Popen-Zeile.

%Vor%

Für jetzt haben Sie Zeile in Zyklus wie:

%Vor%

Verwenden Sie den Wert time =, um den Fortschritt in Prozent zu bestimmen.

    
Arseniy Alexandrov 30.06.2015 16:55
quelle
3

Ich denke, du kannst readline nicht verwenden, weil ffmpeg niemals eine Zeile ausgibt, der Status wird aktualisiert, indem man \ r (carrige return) schreibt und dann die Zeile erneut schreibt.

%Vor%

Wenn Sie die Zeile oben betrachten, werden Sie feststellen, dass es nur eine \ n gibt, die gedruckt wird, wenn die Datei konvertiert wurde.

    
Linus Unnebäck 01.03.2010 20:05
quelle
2

Da ffmpeg die Daten unflushed in stderr schreibt, müssen Sie den stderr-Dateideskriptor mit fcntl auf nicht blockierend setzen.

%Vor%

und dann Schleife mit Auswahl, um die Daten zu lesen

%Vor%

für das vollständige Beispiel gehen hier .

    
Derrick Petzold 21.08.2010 05:50
quelle
-1

FFMPEG:

FFMPEG gibt den gesamten Statustext (was Sie sehen, wenn Sie ihn manuell in der Befehlszeile ausführen) auf der stderr-Schnittstelle aus. Um die Ausgabe von ffmpeg zu erfassen, müssen Sie die stderr-Schnittstelle beobachten - oder sie wie das Beispiel umleiten.

Überprüfen Sie die Ausgabe auf stderr:

Hier ist eine andere Möglichkeit, zu versuchen, von stderr zu lesen, anstatt es beim Aufruf von Popen

umzuleiten

Die Popen-Klasse in Python hat ein Dateiobjekt namens stderr, auf das Sie auf dieselbe Weise zugreifen würden Sie greifen auf stdout zu. Ich denke, Ihre Schleife würde ungefähr so ​​aussehen:

%Vor%

Haftungsausschluss: Ich habe das in Python nicht getestet, aber ich habe eine vergleichbare Anwendung mit Java erstellt.

    
Bryan Rehbein 21.09.2009 16:53
quelle
-2
%Vor%     
Petr J 12.11.2017 23:17
quelle

Tags und Links