Seite 1 von 2

FFmpeg subprocess.Popen stdout leer?

Verfasst: Mittwoch 16. Februar 2011, 19:41
von tommyly
Hey!
Ich hocke hier jetzt schon 2 Tage dran und kämpfe mit den Kommandozeilenausgaben von ffmpeg rum :D
Ergebnis: Läuft immer noch nicht.
Eigentlich klingt das Problem noch recht einfach: FFmpeg auf eine Videodatei ausführen und die Ausgabe in eine Variable bekommen. (Um die Metadaten zu bekommen, v.a. Länge usw.)
Hier der Code:

Code: Alles auswählen

import subprocess

output = subprocess.Popen(r"[PFAD_ZU_FFMPEG_BIN] -i [PFAD_ZU_VIDEODATEI]", stdout=subprocess.PIPE).stdout.read()
Ausgabe von output mittels print liefert mir nur nen leeren Bytesstring, also wohl die letzte Zeile der Ausgabe. Wo bleibt der Rest? :D

Danke ;)

Re: FFmpeg subprocess.Popen stdout leer?

Verfasst: Mittwoch 16. Februar 2011, 19:48
von Hyperion
Das ist doch kein funktionierender Parameter?!?

Code: Alles auswählen

r"[PFAD_ZU_FFMPEG_BIN] -i [PFAD_ZU_VIDEODATEI]"

Re: FFmpeg subprocess.Popen stdout leer?

Verfasst: Mittwoch 16. Februar 2011, 19:51
von tommyly
natürlich ist das keiner :D
Ich kann euch ja auch gerne mit dem ganzen Pfad posten:

Code: Alles auswählen

import subprocess

output = subprocess.Popen(r"Z:\Python\bin\ffmpeg -i Z:\Python\bin\video.wmv", stdout=subprocess.PIPE).stdout.read()

Re: FFmpeg subprocess.Popen stdout leer?

Verfasst: Mittwoch 16. Februar 2011, 19:56
von Hyperion
tommyly hat geschrieben:natürlich ist das keiner :D
Man sollte das schon genau so posten, wie man es auch ausführt - der Fehler kann ja durchaus da drin liegen ;-)
tommyly hat geschrieben:

Code: Alles auswählen

import subprocess

fileoutput = subprocess.Popen([r"Z:\Python\bin\ffmpeg",  "-i", r"Z:\Python\bin\video.wmv"], stdout=subprocess.PIPE).stdout.read()
Probiere es mal so! Die Parameter sollte man als Iterable übergeben, nicht als konkatenierten String.

Re: FFmpeg subprocess.Popen stdout leer?

Verfasst: Mittwoch 16. Februar 2011, 19:59
von tommyly
Gleiches Ergebniss, immer noch leerer Bytesstring :?

Re: FFmpeg subprocess.Popen stdout leer?

Verfasst: Mittwoch 16. Februar 2011, 20:06
von Hyperion
Führ doch auf dem Popen-Objekt mal die communicate()-Methode auf. (Oder ggf. auch wait)

Re: FFmpeg subprocess.Popen stdout leer?

Verfasst: Mittwoch 16. Februar 2011, 20:13
von tommyly
Keine Veränderung bei diesem Code:

Code: Alles auswählen

import subprocess

file = subprocess.Popen([r"Z:\Python\test\bin\ffmpeg",  "-i", r"Z:\Python\test\bin\video.wmv"], stdout=subprocess.PIPE)
file.wait()
[output, other] = file.communicate()
print(output)
(Nicht wundern, Pfad geändert: Habe Dateien verschoben)

Re: FFmpeg subprocess.Popen stdout leer?

Verfasst: Mittwoch 16. Februar 2011, 20:16
von Hyperion
Na, beides macht keinen Sinn! Zudem solltest Du das nicht "file" nennen, da das ein Built-in überschreibt.

Mal doof gefragt: In einer Shell kannst Du das ausführen?

Re: FFmpeg subprocess.Popen stdout leer?

Verfasst: Mittwoch 16. Februar 2011, 20:26
von tommyly
Habs auch einzeln probiert.
In der Shell funktionierts und wirft dann ne mehrere Zeilen lange Meldung aus (mit allen Metadaten usw.)

U.a. aber auch, dass mindestens eine Ausgabedatei angegeben sein muss. Könnte es sein, dass ffmpeg einen Returncode != 0 zurückgibt und deswegen die vorigen Meldungen alle verworfen werden?

EDIT:
Habs nochmal per call probiert, Returncode ist 1. Vielleicht liegt es daran ... Andere Vorschläge, trotzdem die Ausgaben zu bekommen?

EDIT2:
Lösung selber gefunden:
Returncode != 0 also nen Error. Dann werden die Ausgaben auch nicht mehr in stdout geschrieben sondern in stderr. Mit der zusätzlichen Angabe von stderr=subprocess.STDOUT schreibt er dann auch alle Errors in stdout und man kann sie wie ganz normale Ausgaben behandeln. Trotzdem danke :)

Re: FFmpeg subprocess.Popen stdout leer?

Verfasst: Mittwoch 16. Februar 2011, 20:36
von cofi
Evtl schreibt ffmpeg auf `stderr`, das wird es auf jeden Fall tun, wenn der Exitcode != 0 ist.
Ausgaben werden aber nicht verworfen.

Re: FFmpeg subprocess.Popen stdout leer?

Verfasst: Mittwoch 16. Februar 2011, 20:37
von tommyly
Habs schon selbst entdeckt.
Trotzdem vielen Dank ;)

Re: FFmpeg subprocess.Popen stdout leer?

Verfasst: Mittwoch 16. Februar 2011, 22:43
von Rebecca
Ich rate mal: ffmpeg haette gerne auch einen Parameter fuer die Ausgabedatei.

Re: FFmpeg subprocess.Popen stdout leer?

Verfasst: Donnerstag 17. Februar 2011, 19:58
von tommyly
Ja, genau, den kann ich aber nicht angeben.
Wollte ja nur die Metadaten des Videos bekommen ;)

Re: FFmpeg subprocess.Popen stdout leer?

Verfasst: Samstag 14. Mai 2016, 14:57
von harryberlin
Nur mal kurz danke, der Thread hat mir geholfen. :)

meine function sieht so aus:

Code: Alles auswählen

def run_command(command):
    import subprocess
    return subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT).stdout.read()

Re: FFmpeg subprocess.Popen stdout leer?

Verfasst: Samstag 14. Mai 2016, 15:38
von BlackJack
@harryberlin: Und warum verwendest Du nicht einfach `subprocess.check_output()`? Was zudem den Vorteil hat nicht ausversehen Zombie-Prozesse zu produzieren, den Rückgabecode über die Ausnahme liefert falls der nicht 0 ist, und auch nicht standardmässig ``shell=True`` gesetzt hat, was man vermeiden sollte.

Re: FFmpeg subprocess.Popen stdout leer?

Verfasst: Samstag 14. Mai 2016, 17:05
von harryberlin
wie muss es mit check_out() aussehen?
hatte heut etliches probiert, auch "check_out()" war dabei, aber ohne erfolg.
Wo entsteht und Was ist ein Zombie-Prozess?

Re: FFmpeg subprocess.Popen stdout leer?

Verfasst: Samstag 14. Mai 2016, 17:29
von BlackJack
@harryberlin: Ein Zombie-Prozess ist einer der zwar schon komplett durchgelaufen ist, wo aber der Elternprozess den Rückgabecode noch nicht abgefragt hat. Deshalb muss das Betriebssystem noch in der Prozesstabelle führen. Der ist also noch da, obwohl er eigentlich tot ist → Zombie. Die Wikipedia-Seite zu dem Begriff ist übrigens der erste Treffer wenn ich nach „zombie prozess“ suche…

Re: FFmpeg subprocess.Popen stdout leer?

Verfasst: Samstag 14. Mai 2016, 17:35
von harryberlin
also "shell=True" einfach weglassen, und dann passt es?
wie muss es mit check_out() aussehen?
hatte heut etliches probiert, auch "check_out()" war dabei, aber ohne erfolg.

Re: FFmpeg subprocess.Popen stdout leer?

Verfasst: Samstag 14. Mai 2016, 17:51
von BlackJack
@harryberlin: Naja nicht nur das `shell`-Argument weglassen sondern dann natürlich auch das Kommando als Liste angeben und nicht als Zeichenkette die erst von einer Shell interpretiert werden muss.

Re: FFmpeg subprocess.Popen stdout leer?

Verfasst: Samstag 14. Mai 2016, 17:56
von harryberlin
zu check_out:
wie muss es mit check_out() aussehen?
hatte heut etliches probiert, auch "check_out()" war dabei, aber ohne erfolg.

zu zombie:
also so?

Code: Alles auswählen

def run_command(command):
    import subprocess
    return subprocess.Popen(command.split(), stdout=subprocess.PIPE, stderr=subprocess.STDOUT).stdout.read()