Frage von Andreas_Kiel:Hi,
wenn man größere Projekte hat, braucht man gelegentlich mal ein Standbild. Eine komplette Liste von Standbildern ist nicht schlecht, wenn man sein Projekt dokumentieren will. Statt nun einen Azubi zu triezen, nimmt man den VLC-Player und ein wenig Script ... fertig!
Voraussetzungen:
- Der VLC-Player ist installiert;
- Sein Hotkey für einen Snapshot steht defaultmäßig auf Shift+S;
- Der Windows-Scripting Host ist aktiviert, bei mir unter XP ist es Version 5.7;
- der nachfolgende Code ist unter einem fast beliebigen Namen mit der Endung ".vbs" abzulegen.
Funktionsweise:
- Das Script nimmt ein kpl. Verzeichnis als Objekt entgegen und übergibt jede Datei als Parameter dem VLC;
- Der VLC startet mit dieser Datei;
- zwei Sekunden später wird ein Snapshot ausgelöst, indem Shift+S als Tastendruck simuliert wird;
- wiederum zwei Sekunden später wird der VLC beendet (ist wichtig, weil er sonst jedesmal eine neue Instanz aufbaut);
- nächste Datei usw. usw.
dim dateien
' nimmt die Anzahl der Dateien im Verzeichnis auf
dim counter
'zählt mit, wichtig vielleicht zum testen - siehe unten
testendung = "m2t"
' das ist die Endung der Dateien, die verarbeitet werden sollen
' es sollte mit allen Endungen funktionieren, wenn der VLC die verarbeitet
set ws = CreateObject("Wscript.shell")
' ein Shell-Objekt, um Programme zu starten
set fso = Createobject("Scripting.filesystemobject")
' ein Filesystem-Objekt
set verzeichnis = fso.getfolder("\\server02\capturing")
' Aus diesem Verzeichnis die einzelnen Dateien nehmen, besser sind Laufwerksbuchstaben
' Nächste zwei Zeilen erzeugen eine Protokolldatei
set fs = Createobject("Scripting.filesystemobject")
set logbuch = fs.opentextfile("\\server02\capturing\Standbilder\standbilder.txt", 8, true,0)
' wenn sie existiert, wird angefügt
dateien = verzeichnis.files.count
' anzahl ist evtl. interessant, zählt aber alles
counter = 1
For Each file In verzeichnis.files
' jetzt jede gefundene Datei öffnen
Set f1 = fso.GetFile(file.path)
endung = fso.GetExtensionName(f1)
' was isses?
if endung = testendung then
' wenn also der gewünschte Typ vorliegt
ws.run("I:\Programme\VideoLAN\VLC\vlc.exe " + file.path)
' Starte den VLC mit dieser Datei
wscript.sleep 2000
' Wartet 2 Sekunden, damit das Bild stabil ist
' manchmal hat man zu Beginn Wackler
ws.sendkeys ("S")
' Sende jetzt den Hotkey für einen Screenshot - default Shift S
wscript.sleep 2000
' Warte erneut 2 Sekunden, damit der VLC nicht während dem Speichern ALT F4 bekommt
' das würde sonst nicht ausgeführt
ws.sendkeys ("%{f4}")
' ALT F4 senden und VLC damit beenden
logbuch.writeline now & " - " & file.path & " = Standbild erzeugt"
' erfolgreiche Datei in Protokoll
else
logbuch.writeline now & " - " & file.path & " = passt net"
' Dateityp passt nicht
end if
counter = counter + 1
'if counter > 20 then wscript.quit
' Auskommentieren im Echtbetrieb. Zum Spielen und Testen unbedingt unkommentiert verwenden
' Script kann Stunden brauchen und ist so gut wie nicht abzubrechen
next
logbuch.close
msgbox "Standbilder wurden erzeugt"
Wichtige Hinweise:
Das Tüdelchen vor der Zeile
'if counter > 20 then wscript.quit
sollte für die ersten Spielereien entfernt werden.
Das Script läßt sich extrem schwer bis gar nicht unterbrechen, auch nicht mit dem Taskmanager. Warum? Weil es mit ALT-F4 alle paar Sekunden das aktive Programm beendet, und wenn das der Taskmanager ist, bleibt der VLC offen und der TM wird gecancelt.
Im VLC kann man als Dateinamen für die Snapshots statt dem Default vlc-snapshot auch eingeben:
snapshot_$N. Wenn nun die Videodatei
xyz_2009_10_12_18_12_28.m2t heißt (so z.B. aus HDVSplit erzeugz mit Datum, Zeit), wird der Screenshot
xyz_2009_10_12_18_12_28_m2tnnnnn.png heißen. Statt der
roten nnnnn wird eine Ziffer vom VLC geschrieben. Wie man die wegkriegt, weiß ich nicht, aber egal: jetzt hat man einen Snapshot, der den gleichen Dateinamen trägt wie die dazugehörige Videodatei.
Zu den Pausenzeiten: auf einem Quadcore sind 2000 ms genau richtig. Bei langsamen Rechnern /Platten oder Dateien auf Servern kann es zu Verzögerungen beim Öffnen durch den VLC kommen. Dann geht das Kommando Snapshot! ins Leere.
Wenn Dateien kürzer sind als diese 2 Sekunden, dann bekommt man keinen Snapshot, sondern der VLC stoppt und bleibt als "idle Prozeß" stehen. Nach einem Verzeichnis mit 1.800 m2t-Dateien hatte ich aber nur 13 Instanzen vom VLC, das schadet aber nicht.
Die simulierten Tastendrücke wirken auf das gerade im Vordergrund aktive Programm ein. Also vorher alle Programme schließen, die man nicht braucht. Das bedeutet natürlich, daß während der Arbeit des Scriptes der Rechner auch zu nichts anderem mehr gebraucht werden sollte. Was da sonst noch so aufploppen kann, sollte man vorher tunlichst deaktivieren.
Mit HDV-Bildern (1.920x1.088) können pro Bild um 4 MB anfallen, wenn man das voreingestellte PNG-Format zum Speichern verwendet. Man sollte im Ziellaufwerk genügend Platz vorsehen ;-)
Wer jetzt nicht alles in getrennte Dateien captured, sondern nur in eine, kann die Laufzeit des Films nehmen, alle zehn Sekunden einen Snapshot machen und den Timecode stattdessen als Dateinamen verwenden. So kann man sich in Riesendateien schneller zurechtfinden.
BG,
Andreas
Antwort von B.DeKid:
Coole Sache nun legste noch in MultimediaBuilder eine GUI an und Verknüpfst das Script und fertig ist dei Video Snapshot Progi;-)
Zur Sicherheit in die MMB File noch nen Installations Abfrage von VLC und im Archiv ne VLC exe oder ne Direkte Download Anwendung.
Aber wie gesagt sehr gute Idee ;-P
MfG
B.DeKid