Ein AppleScrit mit dem man ein Segment aus einem Videofile in mp4 und mp3 komprimiert und ein Frame extrahiert. das Script muss im AppleScript Editor als Programm abgespeichert werden. Anschließend können die Videofiles per Drag&Drop drauf gezogen werden. Es muss dann nur noch die Anfangszeit und die Endzeit in Form von 00:00:00.00 angegeben werden.
Hat man kein File, oder mehr als ein File ausgewählt wird eine Warnmeldung ausgegeben.
set filecount to0onopen infile
set filecount tocount infile
if(filecount > 1)thendisplay dialog"Please select only one file!"returnendifset filename todo shell script ¬
"perl -e \"print quotemeta ('"&POSIX pathof infile &"');\""set revChar to reverse of(characters of filename)asstringset x to(offset of"."in revChar)+1set outname totext1thru-x of filename
set StartFrame totext returned of(display dialog"Start Time:"with icon note default answer"00:15:00.24"buttons{"Cancel", "OK"} default button {"OK"})set EndTime totext returned of(display dialog"End Time:"with icon note default answer"01:00:00.24"buttons{"Cancel", "OK"} default button {"OK"})set ExtractFrame totext returned of(display dialog"Enter ExtractFrame:"with icon note default answer"00:00:30.10"buttons{"Cancel", "OK"} default button {"OK"})set std1 totext1thru2of StartFrame
set min1 totext4thru5of StartFrame
set sec1 totext7thru8of StartFrame
set fps1 totext10thru11of StartFrame
set stdtoframe to std1 *60*60*25set mintoframe to min1 *60*25set sectoframe to sec1 *25set framenum to stdtoframe + mintoframe + sectoframe + fps1
set std2 totext1thru2of EndTime
set min2 totext4thru5of EndTime
set sec2 totext7thru8of EndTime
set fps2 totext10thru11of EndTime
set stdtoframe2 to std2 *60*60*25set mintoframe2 to min2 *60*25set sectoframe2 to sec2 *25set framenum2 to stdtoframe2 + mintoframe2 + sectoframe2 + fps2
set FrameRange to framenum2 - framenum
set AppleScript's textitemdelimitersto","set endstd to FrameRange /25/60/60asstringset endstd totextitem1of endstd
set endmin to FrameRange /25/60- endstd *60asstringset endmin totextitem1of endmin
set endsec to FrameRange /25- endstd *3600- endmin *60asstringset endsec totextitem1of endsec
set endfps to round (FrameRange /25- endstd *3600- endmin *60- endsec)*25set timerange to endstd &":"& endmin &":"& endsec &"."& endfps
tellapplication"Terminal"activate
do script"/Applications/ffmpeg -ss "& StartFrame &" -t "& timerange &" -filter:v yadif=0:0:0 -i "& filename &" -pix_fmt yuv420p -vcodec libx264 -crf 23 -preset slower -s 384x216 -sws_flags lanczos -acodec aac -strict experimental -ac 1 -ar 44100 -ab 128k -threads 0 -y "& outname &".mp4; /Applications/ffmpeg -ss "& StartFrame &" -t "& timerange &" -i "& filename &" -vn -acodec libmp3lame -ac 1 -ar 44100 -ab 64k -y "& outname &".mp3; /Applications/ffmpeg -ss "& ExtractFrame &" -filter:v yadif=0:0:0 -i "& filename &" -frames 1 -s 500x280 -sws_flags lanczos -pix_fmt yuvj420p -sameq -y "& outname &"_"& ExtractFrame &".jpg; exit"endtellendopenif filecount <1thendisplay dialog"Please Drag and Drop Video File for Video / Audio Compression and Frame- Extraction for Website on it!"returnendif
set filecount to 0
on open infile
set filecount to count infile
if (filecount > 1) then
display dialog "Please select only one file!"
return
end if
set filename to do shell script ¬
"perl -e \"print quotemeta ('" & POSIX path of infile & "');\""
set revChar to reverse of (characters of filename) as string
set x to (offset of "." in revChar) + 1
set outname to text 1 thru -x of filename
set StartFrame to text returned of (display dialog "Start Time:" with icon note default answer "00:15:00.24" buttons {"Cancel", "OK"} default button {"OK"})
set EndTime to text returned of (display dialog "End Time:" with icon note default answer "01:00:00.24" buttons {"Cancel", "OK"} default button {"OK"})
set ExtractFrame to text returned of (display dialog "Enter ExtractFrame:" with icon note default answer "00:00:30.10" buttons {"Cancel", "OK"} default button {"OK"})
set std1 to text 1 thru 2 of StartFrame
set min1 to text 4 thru 5 of StartFrame
set sec1 to text 7 thru 8 of StartFrame
set fps1 to text 10 thru 11 of StartFrame
set stdtoframe to std1 * 60 * 60 * 25
set mintoframe to min1 * 60 * 25
set sectoframe to sec1 * 25
set framenum to stdtoframe + mintoframe + sectoframe + fps1
set std2 to text 1 thru 2 of EndTime
set min2 to text 4 thru 5 of EndTime
set sec2 to text 7 thru 8 of EndTime
set fps2 to text 10 thru 11 of EndTime
set stdtoframe2 to std2 * 60 * 60 * 25
set mintoframe2 to min2 * 60 * 25
set sectoframe2 to sec2 * 25
set framenum2 to stdtoframe2 + mintoframe2 + sectoframe2 + fps2
set FrameRange to framenum2 - framenum
set AppleScript's text item delimiters to ","
set endstd to FrameRange / 25 / 60 / 60 as string
set endstd to text item 1 of endstd
set endmin to FrameRange / 25 / 60 - endstd * 60 as string
set endmin to text item 1 of endmin
set endsec to FrameRange / 25 - endstd * 3600 - endmin * 60 as string
set endsec to text item 1 of endsec
set endfps to round (FrameRange / 25 - endstd * 3600 - endmin * 60 - endsec) * 25
set timerange to endstd & ":" & endmin & ":" & endsec & "." & endfps
tell application "Terminal"
activate
do script "/Applications/ffmpeg -ss " & StartFrame & " -t " & timerange & " -filter:v yadif=0:0:0 -i " & filename & " -pix_fmt yuv420p -vcodec libx264 -crf 23 -preset slower -s 384x216 -sws_flags lanczos -acodec aac -strict experimental -ac 1 -ar 44100 -ab 128k -threads 0 -y " & outname & ".mp4; /Applications/ffmpeg -ss " & StartFrame & " -t " & timerange & " -i " & filename & " -vn -acodec libmp3lame -ac 1 -ar 44100 -ab 64k -y " & outname & ".mp3; /Applications/ffmpeg -ss " & ExtractFrame & " -filter:v yadif=0:0:0 -i " & filename & " -frames 1 -s 500x280 -sws_flags lanczos -pix_fmt yuvj420p -sameq -y " & outname & "_" & ExtractFrame & ".jpg; exit"
end tell
end open
if filecount < 1 then
display dialog "Please Drag and Drop Video File for Video / Audio Compression and Frame- Extraction for Website on it!"
return
end if
Mit FFmpeg lassen sich Clips auch deshaken. Ob es immer gut funktioniert und mit den „Großen“ mithalten kann, kann ich momentan nicht beurteilen.
Die ersten vier Stellen des Filter geben das Rechteck an in dem die Bewegung gesucht wird (x, y, w, h), -1 überall bedeutet, dass das ganze Bild analysiert wird.
Die nächsten beiden Ziffern (rx, ry) geben die maximale Ausmaße der Bewegung an. Als nächstes kommt der edge Parameter, welcher angibt wie die entstehenden Ränder befüllt werden sollen, 0 der Rand wird leer gelassen, 1 das Original-Bild wird genommen und gekachelt, 2 die Kanten werden extrudiert und 3 das Bild wir gespiegelt.
Die nächste Zahl gibt die Blockgröße für die Bewegungssuche an, zwischen 0 und 64 ist zulässig. Anschließend kann die Kontrastschwelle für die Blöcke angegeben werden, nur Blöcke mit mehr als der angegebene Kontrast werden berücksichtigt, Bereich 1-255.
die letzte Ziffer gibt die Suchstrategie an = 0: erschöpfende Suche, 1: weniger erschöpfende Suche. Standard – erschöpfende Suche. Es kann auch noch ein Logfile angeben werden, wenn das benötigt wird.
Wenn am Rand genug Platz ist, macht es Sinn das Video zu croppen (Beschneiden), das geschieht mit: -filter:v crop=1600:900.
Hier ein Beispiel wie ffmpeg zum Deinterlacing verwendet werden kann. -vf eldorder=tff gibt an, dass das Inputvideo Top Field first ist.
-filter:v yadif=0:0:0 ist für das Deinterlacing verantwortlich, die erste Ziffer gibt den Mode an von yadif: 0 bedeutet 1 Frame pro Frame, 1 bedeutet 1 Frame per Field, 2 verwirft den „spatial interlacing check“ und 3 ist wie 1 nur wird hier auch der „spatial interlacing check“ übergangen. Die zweite Ziffer gibt parity an: 0 heißt Top Field First, 1 Bottom Field First und -1 automatisch. Die dritte Ziffer regelt auto, hier wird unterschieden zwischen 0 = alle Frames werden deinterlaced und 1 nur die Frames werden deinterlaced welche interlaced makiert wurden.
Mit -preset medium spart man sich den ganzen x264 Codec „Brimborium“ (hier gehen auch die Presets: ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow, placebo). -s 768×432 -sws_flags lanczos skaliert das Video mit dem Lanczos Filter:
FFmpeg kann jetzt auch in prores encodieren. Profile 3 steht für HQ, 0 wäre Proxy, -acodec pcm_s24le ist optional/bzw. für eine höhere Bittiefe, -flags +ilme+ildct für interlaced Material und mit -top 1 kann man angeben ob oberes Halbbild zuerst, oder unteres Halbbild (-top 0):