Vom video player zu Animated Gif mit Automator

C

cam4com

Registriert
Thread Starter
Dabei seit
10.08.2014
Beiträge
1
Reaktionspunkte
0
hallo,

ich brauch ein Automator Dienst der mit ein video das ich im player offen habe in ein gif umwandelt.
dazu soll ImageMagick benutzt werden oder wenn es was besseres gibt :) .

genauer Ablauf:

ich habe im player MplayerX ein video offen und drücke an einer stelle pause.
dann benutze ich den automator dienst "am besten mit shortcut" dann wird ab der stelle im video die gerade im player ist ein gif erzeugt das die nächsten 20 frames als gif abspeichert.
ich weis das gif ist dann sehr gross ist aber es wird dann noch weiter bearbeitet.

es währe eine riesige arbeitserleichterung für mich und ich würde gerne für Hilfe eine "Aufwandsentschädigung" geben.
 
Hallo und willkommen hier im Forum erstmal!

Dein Vorhaben lässt sich mit relativ geringem Aufwand bewältigen. Hier ein Ansatz:

Du brauchst:
- VLC Player (MPlayerX lässt sich schlechter skripten)
- ffmpeg zum extrahieren der Frames
- Image Magick zum Erstellen des GIFs (ffmpeg kann das zwar auch, die Qualität ist aber schlechter).

Das Skript:

Code:
[B]property [/B][COLOR=#4F8F00][FONT=Verdana]theLength[/FONT][/COLOR][FONT=Verdana] : 10 [/FONT][COLOR=#5E6161][FONT=Verdana]-- in seconds
[/FONT][/COLOR][FONT=Verdana][B]property[/B] [COLOR=#4f8f00]theResolution[/COLOR] : "480x270" [COLOR=#5e6161]-- in pixels x pixels[/COLOR][/FONT]
[COLOR=#5E6161][FONT=Verdana][COLOR=#000000][B]property[/B] [/COLOR][COLOR=#4f8f00]theFrameDivisor[/COLOR][COLOR=#000000] : 3 [/COLOR]-- use every xth frame [/FONT][/COLOR]
[FONT=Verdana]
[/FONT][FONT=Verdana][B]tell[/B] [COLOR=#0433ff][I]application[/I][/COLOR] "VLC"[/FONT]
[COLOR=#812FDC][FONT=Verdana][COLOR=#000000]    [B]set[/B] [/COLOR][COLOR=#4f8f00]thePath[/COLOR][COLOR=#000000] [B]to[/B] [/COLOR]path of current item[/FONT][/COLOR]
[COLOR=#812FDC][FONT=Verdana][COLOR=#000000]    [B]set[/B] [/COLOR][COLOR=#4f8f00]thePos[/COLOR][COLOR=#000000] [B]to[/B] [/COLOR]current time[/FONT][/COLOR]
[FONT=Verdana][B]end[/B] [B]tell[/B][/FONT]
[FONT=Verdana]
[/FONT][FONT=Verdana][COLOR=#012fbe][B]do shell script[/B][/COLOR] "f=\"" & [COLOR=#4f8f00]thePath[/COLOR] & "\";[/FONT]
[FONT=Verdana]mkdir -p \"${f%.*}\";[/FONT]
[FONT=Verdana]cd \"$_\";[/FONT]
[FONT=Verdana]/usr/local/bin/ffmpeg -ss " & [COLOR=#4f8f00]thePos[/COLOR] & " -i \"$f\" -t " & [COLOR=#4f8f00]theLength[/COLOR] & " -s " & [COLOR=#4f8f00]theResolution[/COLOR] & " -f image2 %03d.png;[/FONT]
[FONT=Verdana]count=$(ls|wc -l);[/FONT]
[FONT=Verdana]/usr/local/bin/convert -delay 1x8 $(seq -f %03g.png 1 " & [/FONT][COLOR=#4F8F00][FONT=Verdana]theFrameDivisor[/FONT][/COLOR][FONT=Verdana] & " $count) -coalesce -layers OptimizeTransparency \"${f%.*}.gif\""[/FONT]

In den ersten 3 Zeilen kannst die Länge des Clips in Sekunden, die Auflösung und wieviele Frames benutzt werden sollen einstellen (z.B. jeder 3. Frame). Das Skript erstellt im Ordner des Videos einen neuen Ordner mit den Frames und das GIF.

Öffne zum Testen ein Video im VLC Player, springe an die entsprechende Stelle und starte dann das Skript. Mit dem Automator kannst du das Skript dann auch als Dienst einrichten und einen Shortcut zuweisen.

Beispiel GIF: http://cl.ly/image/1J1042323o2x
 
hey cool wie kann man das in automator einbinden ? ich bekomme da nur syntaxfehler wenn ich es in "apple scripts" rein kopiere
 
So sieht das Skript im Automator aus:

Code:
[B]property [/B][COLOR=#4F8F00][FONT=Verdana]theLength[/FONT][/COLOR][FONT=Verdana] : 10 [/FONT][COLOR=#5E6161][FONT=Verdana]-- in seconds
[/FONT][/COLOR][FONT=Verdana][B]property[/B] [COLOR=#4f8f00]theResolution[/COLOR] : "480x270" [COLOR=#5e6161]-- in pixels x pixels[/COLOR][/FONT]
[COLOR=#5E6161][FONT=Verdana][COLOR=#000000][B]property[/B] [/COLOR][COLOR=#4f8f00]theFrameDivisor[/COLOR][COLOR=#000000] : 3 [/COLOR]-- use every xth frame [/FONT][/COLOR]
[FONT=Verdana]
[/FONT]
[COLOR=#4F8F00][FONT=Verdana][COLOR=#000000][B]on[/B] [/COLOR][COLOR=#0433ff][B]run[/B][/COLOR][COLOR=#000000] {[/COLOR]input[COLOR=#000000], [/COLOR]parameters[COLOR=#000000]}[/COLOR][/FONT][/COLOR]
[FONT=Verdana]    [B]tell[/B] [COLOR=#0433ff][I]application[/I][/COLOR] "VLC"[/FONT]
[COLOR=#812FDC][FONT=Verdana][COLOR=#000000]        [B]set[/B] [/COLOR][COLOR=#4f8f00]thePath[/COLOR][COLOR=#000000] [B]to[/B] [/COLOR]path of current item[/FONT][/COLOR]
[COLOR=#812FDC][FONT=Verdana][COLOR=#000000]        [B]set[/B] [/COLOR][COLOR=#4f8f00]thePos[/COLOR][COLOR=#000000] [B]to[/B] [/COLOR]current time[/FONT][/COLOR]
[FONT=Verdana]    [B]end[/B] [B]tell[/B][/FONT]
[FONT=Verdana]    [/FONT]
[FONT=Verdana]    [COLOR=#012fbe][B]do shell script[/B][/COLOR] "f=\"" & [COLOR=#4f8f00]thePath[/COLOR] & "\";[/FONT]
[FONT=Verdana]mkdir -p \"${f%.*}\";[/FONT]
[FONT=Verdana]cd \"$_\";[/FONT]
[FONT=Verdana]/usr/local/bin/ffmpeg -ss " & [COLOR=#4f8f00]thePos[/COLOR] & " -i \"$f\" -t " & [COLOR=#4f8f00]theLength[/COLOR] & " -s " & [COLOR=#4f8f00]theResolution[/COLOR] & " -f image2 %03d.png;[/FONT]
[FONT=Verdana]count=$(ls|wc -l);[/FONT]
[FONT=Verdana]/usr/local/bin/convert -delay 1x8 $(seq -f %03g.png 1 " & [COLOR=#4f8f00]theFrameDivisor[/COLOR] & " $count) -coalesce -layers OptimizeTransparency \"${f%.*}.gif\""[/FONT]
[B]end [/B][COLOR=#0433FF][FONT=Verdana][B]run[/B][/FONT][/COLOR]

Beim Ausführen muss selbstverständlich ein Video im VLC Player laufen (oder pausiert sein).
 
ich bekomme ne Fehlermeldung nachdem er die bilder aus dem video extrahiert hat.
"Bei der Aktion Applescript ausführen ist ein Fehler aufgetreten" mehr zeigt er nicht an.
wahrscheinlich habe ich Image Magick nicht richtig installiert? habe den installer von http://cactuslab.com/imagemagick/ benutzt.

wenn ich ein video auf habe ind im Automator das script laufen lasse dann kommt:
Syntaxfehler:
sh:
mkdir: command not found
sh:
cd: command not found
sh:
/usr/local/bin/ffmpeg: No such file or directory
sh:
count=: command not found
sh:
/usr/local/bin/convert: No such file or directory
 
Hört sich so an, als stimme die PATH-Variable nicht. Öffne mal das Terminal und poste dann mal hier die Ausgabe von folgendem Befehl:

Code:
[COLOR=#000000]/bin/echo $PATH[/COLOR]
 
sieht nicht richtig aus oder ?
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin:/opt/Ghostscript/bin:/opt/ImageMagick/bin
 
AppleScript scheint nicht die PATH-Variable zu benutzen. Am sichersten ist es wahrscheinlich einfach den vollen Pfad vor jedem Programm anzugeben. Den Pfad findest du so im Terminal raus:

Code:
which Programm

Das sind die Programme:

mkdir, cd, ffmpeg, ls, wc, convert, seq
 
jetzt macht er nicht mal mehr die einzelnen bilder :-/
bei "
which Programm is" gibt er keine antwort


property
theLength : 10 -- in seconds

property theResolution : "480x270" -- in pixels x pixels
property theFrameDivisor : 3 -- use every xth frame




on run {input, parameters}
tell application "VLC"
set thePath to path of current item
set thePos to current time
end tell

do shell script "f=\"" & thePath & "\";
/bin/mkdir -p \"${f%.*}\";
/usr/bin/cd \"$_\";
/usr/local/bin/ffmpeg -ss " & thePos & " -i \"$f\" -t " & theLength & " -s " & theResolution & " -f image2 %03d.png;
count=$(ls|/usr/bin/wc -l);
/opt/ImageMagick/bin/convert -delay 1x8 $(/usr/bin/seq -f %03g.png 1 " & theFrameDivisor & " $count) -coalesce -layers OptimizeTransparency \"${f%.*}.gif\""
end run


Syntaxfehler:

sh:
/bin/mkdir: No such file or directory
sh:
/usr/bin/cd: No such file or directory
sh:
/usr/local/bin/ffmpeg: No such file or directory
sh:
count=: command not found
sh:
/opt/ImageMagick/bin/convert: No such file or directory
 
Der Befehl muss z.B. which mkdir heißen (fürs Terminal).

Mach doch mal ein Thread im UNIX Nachbarforum mit Verweis auf diese Thema auf, da gibt's sicher Leute, die sich besser mit dem Problem auskennen. Es ist mir schleierhaft, warum die Shell-Befehle selbst mit Pfadangabe nicht funktionieren. Das würde eigentlich bedeuten, dass in /bin und /usr/bin keine Programme sind.
 
ja sorry "which is" gibt er keine antwort.

liegt es daran das ich Yosemite benutze ?
 
Sonst versuch doch stattdessen das Ganze als Shell Script aufzurufen... (geht ja auch aus dem Automator heraus) Sind ja eigentlich nur 2-AppleScript-Zeilen die Pill da benutzt hat ;)
Code:
#!/bin/sh

theLength=10;  #in seconds
theResolution="640x360"; #in pixels x pixels
theFrameDivisor=3; #use every xth frame 
 

thePath=$(osascript -e 'tell app "VLC" to get path of current item');
thePos=$(osascript -e 'tell app "VLC" to get current time');

mkdir -p "${thePath%.*}";
cd "$_";
/usr/local/bin/ffmpeg -ss "$thePos" -i "$thePath" -t $theLength -s $theResolution -f image2 %03d.png;
count=$(ls|wc -l);
/usr/local/bin/convert -delay 1x8 $(seq -f %03g.png 1 $theFrameDivisor $count) -coalesce -layers OptimizeTransparency "${thePath%.*}.gif"
 
Zuletzt bearbeitet:
Der Applescripteditor mag keine Mehrzeiler für »do shell script«.
Manchmal geht's, aber oft schleichen sich anscheinend falsche Linebreaks ein und dann geht es nicht mehr.
(Ich vermute, wegen PPC-Altlasten in Verbindung mit Autoformat)

Einfach alles »do shell scriptige« in einen Einzeiler ändern, dann sollte es gehen.

Und für Altsysteme (10.6 und älter) muss jot statt seq verwendet werden.
Für AS: $(jot -w %03g.png - 1 $count " & theFrameDivisor & ")
Für sh: $(jot -w %03g.png - 1 $count $theFrameDivisor)
 
... Sind ja eigentlich nur 2-AppleScript-Zeilen die Pill da benutzt hat ;)
Code:
#!/bin/bash

theLength=10      #in seconds
theResolution=640 #x in pixels (y=auto aspect ratio)
theFrameRate=8    #frames per second

thePath=$(osascript -e 'tell app "VLC" to get path of current item');
thePos=$(osascript -e 'tell app "VLC" to get current time');

mkdir -p "${thePath%.*}" && cd "$_" && \
/usr/local/bin/ffmpeg -i "$thePath" -ss "$thePos" -t "$theLength" -r "$theFrameRate" -vf scale="$theResolution":-1 -f image2 %03d.png && \
/usr/local/bin/convert -delay 1x"$theFrameRate" *.png -coalesce -layers OptimizeTransparency "${thePath%.*}.gif"

Hab's mal vereinfacht/verschnellert. :p
 
Zuletzt bearbeitet:
Einfach ein "Automator/Aktionen/Dienstprogramme/Shell-Script ausführen" erstellen und reinkopieren (statt cat).

Warum geht $(which ls), aber kein $(which convert) im Automator?
Weil der Suchpfad im Automator nicht so wie im Terminal gesetzt ist.

Man muss für Tools die nicht in /usr/bin:/bin:/usr/sbin:/sbin liegen, die absoluten Pfade angeben:
/usr/local/bin/ffmpeg
/usr/local/bin/convert
und natürlich vorher prüfen, ob sie da auch tatsächlich sind (siehe #9).
 
Zuletzt bearbeitet:
@Olivetti: Beim Shebang fehlt ein Ausrufezeichen.

Beim Automator lässt sich bei der Shell Script Aktion auswählen welcher Interpreter benutzt werden soll, das sollte natürlich das Problem beheben. Warum das Problem auftrat, ist mir aber immer noch nicht so ganz klar, Zeilenumbrüche sollten doch bei einem Semikolon am Ende jedes Befehls egal sein. Nuja, wenns so klappt, dann ist ja alles in Ordnung.
 
@Pill:

Thanx, hab's ausgebessert.

Der Applescripteditor hat so manche Macke. Und evtl. greift der Automator auch darauf zu (lib?).
Du kannst mal versuchen, aus deinem Script einen Einzeiler zu machen -> speichern ->
dann wieder auf mehrere Zeilen auftrennen -> speichern.
Meistens geht es dann auch.
(Bei dir geht es ja. Wenn die Syntax Error kommen, sollte man es ausprobieren, will ich damit sagen)
 
Zuletzt bearbeitet:
jetzt habe ich es endlich geschafft das er gif's macht Supie !!!

nur wenn ich bei grösseren videos ein gif machen will geht die cpu Belastung vom VLC Prozess auf 250%
kann dann ewig warten passiert nichts. muss den prozess dann beenden
 
Zurück
Oben Unten