Thumbnail aus .flv

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Benutzeravatar
Mathmos
User
Beiträge: 36
Registriert: Dienstag 10. August 2010, 21:31

Hallo
ich möchte aus einer .flv datei ein thumbnail erstellen.
jetzt ist nur die frage wie.
was ich bisher rausgefunden habe, soll ffmpeg wohl dafür zuständig sein.
so wie ich das bisher überall gelesen habe, ist es schonmal kein import, sondern ein eigenständiges programm.



eine frage noch am rande.
wie kann ich den ablauf eines laufenden programmes stoppen?
die einzige lösung die ich bisher gefunden habe, ist sys.exit().
aber das ist nicht ganz mein ziel.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Mathmos hat geschrieben:Hallo
ich möchte aus einer .flv datei ein thumbnail erstellen.
jetzt ist nur die frage wie.
was ich bisher rausgefunden habe, soll ffmpeg wohl dafür zuständig sein.
so wie ich das bisher überall gelesen habe, ist es schonmal kein import, sondern ein eigenständiges programm.
Schau Dir mal das subprocess-Modul an!
Mathmos hat geschrieben: eine frage noch am rande.
wie kann ich den ablauf eines laufenden programmes stoppen?
die einzige lösung die ich bisher gefunden habe, ist sys.exit().
aber das ist nicht ganz mein ziel.
Das ist zu unpräzise. Was meinst Du mit "Programm"? Was meinst Du mit stoppen?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
Mathmos
User
Beiträge: 36
Registriert: Dienstag 10. August 2010, 21:31

ok, werd ich mir mal anschauen.

ich meinte damit, das ich gerne einen block, der gerade abgearbeitet wird stoppen kann.
so bekommt man zwar einen warnung, aber der nachfogende code wird trotzdem ausgeführt.

Code: Alles auswählen

if entTitel.get() == "":
	tkMessageBox.showwarning('Achtung','Alle Felder ausf\xfcllen')
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Immer noch zu unpräzise!

Bist Du in einer GUI? Da gibts eh Nebenläufigkeit, usw. Prinzipiell könnten Threads eine Lösung sein (aber eher nicht in einer GUi).

Desweiteren mache dazu mal lieber nen neuen Thread auf.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Zufälligerweise schreibe ich grade nebenher ein FFmpeg-Binding für Python. Ist zwar total hacky und hässlich, erfüllt aber zur Zeit seinen Zweck :-)

Du findest es hier: stupFF -- stupid FFmpeg Binding. Gibt zwar keine Doku, aber vielleicht verstehst du's ja trotzdem, ansonsten einfach nachfragen.
Benutzeravatar
Mathmos
User
Beiträge: 36
Registriert: Dienstag 10. August 2010, 21:31

Danke Dauerbaustelle, aber ich habe es mittlerweile hinbekommen.
Hab es nun so gemacht wie Hyperion es vorgeschlagen hatte.

Die Seite hat mir dabei sehr geholfen =)
http://www.gossamer-threads.com/lists/python/dev/663045
Benutzeravatar
Mathmos
User
Beiträge: 36
Registriert: Dienstag 10. August 2010, 21:31

ich spiel gerade einwenig mit der converter funktion von ffmpeg rum.
vllt kann mir ja hier jemand sagen, was die optimalsten einstellungen (bitrate usw.) für eine konvertierung zu ein .flv sind?
eine gesunde mischung aus quallität und dateigröße wäre wohl ambesten.
alles was ich bisher erreicht habe, waren entwter zu große dateien oder zu schlecht quallität^^
Benutzeravatar
Mathmos
User
Beiträge: 36
Registriert: Dienstag 10. August 2010, 21:31

und wieder ein problem.

ich habe nun aus meiner py mit py2exe eine exe erstellen lassen.

alle erforderlichen daten die ich noch zusätzlich brauche, zb den ffmpeg ordner, habe ich dann in den dist ordner kopiert.

wenn ich das programm nun starte bekomme ich eine fehlermeldung die mit try bzw except erstellt wurde...
ich habe keine ahnung woran es liegen könnte, da es ohne py2exe ja wunderbar funktioniert.

genaugenommen handelt es sich um folgende zeile.

Code: Alles auswählen

p = subprocess.Popen(args, shell=True, stdout=subprocess.PIPE)
der ganze block sie so aus.

Code: Alles auswählen

my_vid_path = askopenfilename(filetypes=[("Flash Video Files", "flv")])
pic_name = entTitel.get().replace(" ", "_")+".png"
pic_nach_sekunden = entSec.get()

ffmpeg_path = os.getcwd()+'/ffmpeg/bin/ffmpeg.exe'	
args = [ffmpeg_path, '-i', my_vid_path, '-f', 'mjpeg', '', '-ss', pic_nach_sekunden, '-vframes', '1', '-s', '350x200', '-an', pic_name]
p = subprocess.Popen(args, shell=True, stdout=subprocess.PIPE)
p.wait()
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo.

Gibt es einen Grund, warum die die Fehlermeldung inklusive Traceback nicht verraten möchtest ;-) ?

Warum willst du überhaupt eine exe erzeugen? Dass ist in den meisten Fällen total überflüssig.

Sebastian
Das Leben ist wie ein Tennisball.
Benutzeravatar
Mathmos
User
Beiträge: 36
Registriert: Dienstag 10. August 2010, 21:31

in der log datei steht folgendes...
und line 167 ist die besagte zeile.

Code: Alles auswählen

Exception in Tkinter callback
Traceback (most recent call last):
  File "Tkinter.pyo", line 1403, in __call__
  File "VideoTool.py", line 167, in Upload
  File "subprocess.pyo", line 586, in __init__
  File "subprocess.pyo", line 681, in _get_handles
  File "subprocess.pyo", line 722, in _make_inheritable
TypeError: an integer is required
der grund dafür ist, dass das programm nicht nur für mich ist.
zudem sind zugangsdaten im quelltext entahlten, die nicht unbedingt jeder in die finger bekommen sollte ;)
und man brauch kein python + sämtliche module zu installieren
BlackJack

@Mathmos: Damit "versteckst" Du Zugangsdaten aber nur vor den ganz unfähigen. Das ist also ein sehr schwaches Argument.

Stimmt der Pfad zu `ffmppeg` auch noch? Bei solchen "Exe"n liegen die Dateien ja woanders.

Edit: Ich habe mal 'py2exe subprocess TypeError: an integer is required' in eine Suchmaschine eingegeben und als ersten Treffer diese Seite erhalten: http://www.py2exe.org/index.cgi/Py2ExeS ... teractions
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Mathmos hat geschrieben: zudem sind zugangsdaten im quelltext entahlten, die nicht unbedingt jeder in die finger bekommen sollte ;)
Oha... die solltest Du dringend aus dem Projekt rausnehmen! Denn eine wie auch immer geartete Datei bietet da keinerlei Schutz!
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
Mathmos
User
Beiträge: 36
Registriert: Dienstag 10. August 2010, 21:31

naja, aber die methode ist aufjedenfall sicher als nur eine py.
aber leider werden die da drin bleiben müssen, sonst kann ich keine sachen auf den ftp hochladen.
oder einträge in der datenbank erstellen.

aber ich habe hier mal wa gefunden
http://www.python-forum.de/viewtopic.ph ... 88&start=0
ich habe das jetzt mal so geschrieben wie DatenMetzgerX es gepostet hatte.

nun bekomm ich keine fehlermeldung mehr, aber das programm schmirt an der stelle ab.
manchmal wird noch ein bild erstellt, aber mehr geht dann nicht mehr....

es hängt sich auch auf wenn ich nur die py öffne.
Benutzeravatar
Mathmos
User
Beiträge: 36
Registriert: Dienstag 10. August 2010, 21:31

also, so wie ich das bisher gelsen habe, möchte die exe alle 3 befehle haben. also "stdout, stdin, stderr"
letztendlich brauche ich nur stdout. was kann ich nun hinter stdin und stderr schreiben, damit die von der umgewandelten version akzeptiert werden, aber nichts ausführen?
Benutzeravatar
Mathmos
User
Beiträge: 36
Registriert: Dienstag 10. August 2010, 21:31

nach einem tag im netzt suchen und keine lösung finden, gebe ich auf.

allerdings habe ich irgnedwo gelasen, das man das problem mit einer .bat datei lösen könnnte...
wenn jemand ne idee hat wie man das in die .bat schreiben müsste und wie man werte übergiebt, wäre ich ihm sehr dankbar.

Code: Alles auswählen

ffmpeg_path = os.getcwd()+'/ffmpeg/bin/ffmpeg.exe'	
args = [ffmpeg_path, '-i', myPath, '-f', 'mjpeg', '', '-ss', pic_nach_sekunden, '-vframes', '1', '-s', '350x200', '-an', pic_name]
p = subprocess.Popen(args, shell=True, stdout=subprocess.PIPE)
p.wait()
mfg
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Was genau willst du? Dass stderr nicht ausgegeben wird? Dann setzte ``stderr=open(os.devnull)`` -- der Output wird dann ins Nulldev weitergeleitet. ``shell=True`` brauchst du im Übrigen nicht. Außerdem würde ich "-ss n" VOR "-i datei" setzten. Dann überspringt FFmpeg die entsprechenden Bilder, ohne sie zu verarbeiten.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Mathmos hat geschrieben:also, so wie ich das bisher gelsen habe, möchte die exe alle 3 befehle haben. also "stdout, stdin, stderr"
Welche "exe" meinst Du da? Deine selbst erstellte?
letztendlich brauche ich nur stdout. was kann ich nun hinter stdin und stderr schreiben, damit die von der umgewandelten version akzeptiert werden, aber nichts ausführen?
Was ist denn die "umgewandelte Version"? Meinst Du Deinen Versuch, aus dem Script eine "exe" zu machen? Ich kann mir da beim besten Willen nicht vorstellen, dass sich irgend ein solches Tool in Deinen Code einmischt... oder worauf biezisht Du Dich mit stdin, stderr, usw?

Und: Niemals User / PW Angaben in ein Script packen, welches "öffentlich" gemacht wird. Lass die Benutzer doch einfach die Daten eingeben - dafür kannst Du einen Weg finden Benutzer & Passwörter zu vergeben.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
Mathmos
User
Beiträge: 36
Registriert: Dienstag 10. August 2010, 21:31

Dauerbaustelle hat geschrieben:Was genau willst du? Dass stderr nicht ausgegeben wird? Dann setzte ``stderr=open(os.devnull)`` -- der Output wird dann ins Nulldev weitergeleitet. ``shell=True`` brauchst du im Übrigen nicht. Außerdem würde ich "-ss n" VOR "-i datei" setzten. Dann überspringt FFmpeg die entsprechenden Bilder, ohne sie zu verarbeiten.
nach so einer lösung habe ich den ganzen tag gesucht.... du solltest heilig gesprochen werden :D
es funktioniert einwandfrei =)
wenn ich "-ss n" einfüge, wird garkein thumbnail erzeugt.
Hyperion hat geschrieben:
Mathmos hat geschrieben:also, so wie ich das bisher gelsen habe, möchte die exe alle 3 befehle haben. also "stdout, stdin, stderr"
Welche "exe" meinst Du da? Deine selbst erstellte?
ja, die mit py2exe erstellte exe.
Hyperion hat geschrieben:
Mathmos hat geschrieben: letztendlich brauche ich nur stdout. was kann ich nun hinter stdin und stderr schreiben, damit die von der umgewandelten version akzeptiert werden, aber nichts ausführen?
Was ist denn die "umgewandelte Version"? Meinst Du Deinen Versuch, aus dem Script eine "exe" zu machen? Ich kann mir da beim besten Willen nicht vorstellen, dass sich irgend ein solches Tool in Deinen Code einmischt... oder worauf biezisht Du Dich mit stdin, stderr, usw?
sdout brauche ich damit das thumbnail erstellt wird. allerdings sind die beiden andern befehle überflüssig und wenn ich diese weggelassen habe, funktionierte es weiterhin. aber wenn ich dann die py mit py2exe konvertiert habe kam immer eine fehlermeldung, aber mit der lösung von der heiligen Dauerbaustelle klappt es nun wunderbar =)
Hyperion hat geschrieben: Und: Niemals User / PW Angaben in ein Script packen, welches "öffentlich" gemacht wird. Lass die Benutzer doch einfach die Daten eingeben - dafür kannst Du einen Weg finden Benutzer & Passwörter zu vergeben.
aber das programm muss sich mit einer mysql datenbank verbinden. und sachen auf einen server hochladen.
ich weiß nicht wie ich das ohne im programm gespeicherte zugangsdaten gestallten soll...
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Mathmos hat geschrieben:wenn ich "-ss n" einfüge, wird garkein thumbnail erzeugt.
Na ich meine schon ['-ss', deinezahl].
Benutzeravatar
Mathmos
User
Beiträge: 36
Registriert: Dienstag 10. August 2010, 21:31

will immernoch nicht so ganz funktionieren....
aber das ist auch nicht weiter tragisch.
trozdem danke =)
Antworten