Video schneiden und synchronisieren mit ffmpeg

Atalantia

Atalantia

Aktives Mitglied
Thread Starter
Dabei seit
26.11.2009
Beiträge
1.894
Reaktionspunkte
432
Hallo,
ich stand vor dem Problem, dass ich Video Filme schneiden wollte ohne sie neu zu codieren. Ausserdem war, je weiter hinten im Film, Bild und Ton out of sync. Ich musste also zusätzlich Bild und Ton neu synchronisieren. ffmpeg bietet sich dazu an. Ich schenke Euch dieses Script als dankeschön an das Forum für die vielen Male welche Ihr geholfen habt.
- Das ffmpeg binarie kann man hier runterladen und muss in die Resourcen der Script application gelegt werden.
http://www.osxexperts.net/ffmpeg/ffmpegexperts.html

- "set mark..." sind die Zeiten bei welchen der Schnitt erfolgt. Wenn es weniger als 14 sind, kann man die überflüssigen "do shell script POSIX path of (path to resource "ffmpeg")..." auskommentieren oder löschen. Wenn es mehr sind einfach noch mehr "do shell script...", "set mark..." und "set offset1..." hinzufügen. Es wird bei jedem Schnitt ein neues File erzeugt.

- "set offset1..." ist zusammen mit "set map..." der Wert um den Video und Audio zueinander verschoben werden. Die hier vorgestellte Konfiguration ist gedacht wenn der Ton zu früh kommt. In anderen Fällen muss der Wert in "set map..." geändert werden. (ffmpg man nachschauen)

Die Werte die hier eingetragen sind, sind natürlich nur Beispiele. Selbstverständlich müsst Ihr die TimeCodes von Euerem Video (z.B. mit MpegStreamclip) selber herauslesen und dann in das Script einsetzen um den korrekten Schnitt zu erlangen. Auch die offset Daten muss man anschauen indem man die Filmschnipsel anschaut und dann den Wert ändert bis Bild und Ton synchron sind. Bei mir haben Werte zwischen 0.1 - 4 genügt.
Das Script ist so konfiguriert, dass es bei jedem Durchgang die alten Schnipsel überschreibt. Man kann also korrigieren, ausgeben, nochmal korrigeren, wieder ausgeben... solange bis alles stimmt.

Ach ja, zu guter letzt... wenn der Namen des zu bearbeitenden Videos oder dessen Überordner zu exotisch ist (viele Leerschläge, Sonderzeichen oder zu lang) funktioniert das Script nicht.
Ein anderes Problem welches ich noch nicht gelöst habe ist das Ding mit dem reference frame. Die Schnipsel starten weiss, bis sie an einen ref.Frame geraten der dann das vollständige Bild generiert. Falls jemand dafür die Lösung hat... welcome to share.

Code:
set var to choose file
tell application "System Events"
    set {nameInfo, extInfo} to {name, name extension} of var
end tell
set {output, var1} to {POSIX path of (choose folder with prompt "Choose destination to split " & quoted form of nameInfo), POSIX path of var}

set mark1 to "00:00:00"
set mark2 to "00:07:29"
set mark3 to "00:15:32"
set mark4 to "00:23:04"
set mark5 to "00:30:23"
set mark6 to "00:38:01"
set mark7 to "00:46:49"
set mark8 to "00:53:48"
set mark9 to "01:00:21"
set mark10 to "01:04:32"
set mark11 to "01:08:36"
set mark12 to "01:15:37"
set mark13 to "01:24:14"
set mark14 to "01:31:38"

set offset1 to " -itsoffset 0 "
set offset2 to " -itsoffset 0.8 "
set offset3 to " -itsoffset 0.8 "
set offset4 to " -itsoffset 0.9 "
set offset5 to " -itsoffset 0.9 "
set offset6 to " -itsoffset 0.9 "
set offset7 to " -itsoffset 0.9 "
set offset8 to " -itsoffset 1 "
set offset9 to " -itsoffset 0 "
set offset10 to " -itsoffset 0 "
set offset11 to " -itsoffset 0 "
set offset12 to " -itsoffset 0 "
set offset13 to " -itsoffset 0 "

set map1 to " -map 0:0"
set map2 to " -map 1:1 "

do shell script POSIX path of (path to resource "ffmpeg") & " -i " & quoted form of var1 & offset1 & " -y -i " & quoted form of var1 & " -vcodec copy -acodec copy -ss " & mark1 & " -to " & mark2 & map1 & map2 & quoted form of (output & "Part1." & extInfo)
do shell script POSIX path of (path to resource "ffmpeg") & " -i " & quoted form of var1 & offset2 & "-y -i " & quoted form of var1 & " -vcodec copy -acodec copy -ss " & mark2 & " -to " & mark3 & map1 & map2 & quoted form of (output & "Part2." & extInfo)
do shell script POSIX path of (path to resource "ffmpeg") & " -i " & quoted form of var1 & offset3 & "-y -i " & quoted form of var1 & " -vcodec copy -acodec copy -ss " & mark3 & " -to " & mark4 & map1 & map2 & quoted form of (output & "Part3." & extInfo)
do shell script POSIX path of (path to resource "ffmpeg") & " -i " & quoted form of var1 & offset4 & "-y -i " & quoted form of var1 & " -vcodec copy -acodec copy -ss " & mark4 & " -to " & mark5 & map1 & map2 & quoted form of (output & "Part4." & extInfo)
do shell script POSIX path of (path to resource "ffmpeg") & " -i " & quoted form of var1 & offset5 & "-y -i " & quoted form of var1 & " -vcodec copy -acodec copy -ss " & mark5 & " -to " & mark6 & map1 & map2 & quoted form of (output & "Part5." & extInfo)
do shell script POSIX path of (path to resource "ffmpeg") & " -i " & quoted form of var1 & offset6 & "-y -i " & quoted form of var1 & " -vcodec copy -acodec copy -ss " & mark6 & " -to " & mark7 & map1 & map2 & quoted form of (output & "Part6." & extInfo)
do shell script POSIX path of (path to resource "ffmpeg") & " -i " & quoted form of var1 & offset7 & "-y -i " & quoted form of var1 & " -vcodec copy -acodec copy -ss " & mark7 & " -to " & mark8 & map1 & map2 & quoted form of (output & "Part7." & extInfo)
do shell script POSIX path of (path to resource "ffmpeg") & " -i " & quoted form of var1 & offset8 & "-y -i " & quoted form of var1 & " -vcodec copy -acodec copy -ss " & mark8 & " -to " & mark9 & map1 & map2 & quoted form of (output & "Part8." & extInfo)
do shell script POSIX path of (path to resource "ffmpeg") & " -i " & quoted form of var1 & offset9 & "-y -i " & quoted form of var1 & " -vcodec copy -acodec copy -ss " & mark9 & " -to " & mark10 & map1 & map2 & quoted form of (output & "Part9." & extInfo)
do shell script POSIX path of (path to resource "ffmpeg") & " -i " & quoted form of var1 & offset10 & "-y -i " & quoted form of var1 & " -vcodec copy -acodec copy -ss " & mark10 & " -to " & mark11 & map1 & map2 & quoted form of (output & "Part10." & extInfo)
do shell script POSIX path of (path to resource "ffmpeg") & " -i " & quoted form of var1 & offset11 & "-y -i " & quoted form of var1 & " -vcodec copy -acodec copy -ss " & mark11 & " -to " & mark12 & map1 & map2 & quoted form of (output & "Part11." & extInfo)
do shell script POSIX path of (path to resource "ffmpeg") & " -i " & quoted form of var1 & offset12 & "-y -i " & quoted form of var1 & " -vcodec copy -acodec copy -ss " & mark12 & " -to " & mark13 & map1 & map2 & quoted form of (output & "Part12." & extInfo)
do shell script POSIX path of (path to resource "ffmpeg") & " -i " & quoted form of var1 & offset13 & "-y -i " & quoted form of var1 & " -vcodec copy -acodec copy -ss " & mark13 & " -to " & mark14 & map1 & map2 & quoted form of (output & "Part13." & extInfo)
 
Zuletzt bearbeitet:
Nun, manchmal ist es notwendig zwei Clips zusammenzufügen. Folgendes Script erledigt die Aufgabe. Auch hier wieder ohne den Film neu zu codieren. mancoder muss runtergeladen werden und wieder in den Resource Ordner vom Applescript Programm gelegt werden. (Ich weiss aber nicht mehr wo ich den mencoder binary runtergeladen habe.) Danach einfach die Clips auswählen die zusammengefügt werden sollen. Sie sollten alphabetisch in der Reihenfolge sein in der sie zusammengefügt werden sollen.

Code:
set {var, summfile} to {choose file multiple selections allowed yes, ""}
repeat with x in var
   tell application "System Events"
     set {pathInfo, summfile} to {POSIX path of container of first item of var, summfile & name of x & space}
   end tell
end repeat

do shell script "cd " & quoted form of pathInfo & " && cat " & summfile & "> tmp.avi && " & quoted form of POSIX path of (path to resource "mencoder") & " -forceidx -oac copy -ovc copy tmp.avi -o output.avi && rm -f tmp.avi"
 
Ich will dich ja nicht deprimieren, aber was du da gemacht hast ist scheinbar suboptimaler Käse.

Da deine Korrigierungsabstände relativ gleichmäßig sind, gehe ich davon aus, dass das Videomaterial z.B. für 25 FPS und die Audiodaten für 23,97 FPS aufbereitet war.

Der Ambitionierte User oder Fachmann würde jetzt die Audiodatei entsprechend beschleunigen oder verlangsamen (ca. 4%) und eine Tonhöhenanpassung vornehmen.

Unter Windows gibt es dafür eac3to, man kann das ganze aber auch mit Audacity auf dem Mac machen, da muss man aber die prozentuale Beschleunigung oder Verlangsamung kennen.

Was du gemach hast, sorgt nur dafür, das es "einigermaßen" synchron aussieht.

Bei der Aktion muss man natürlich das Video auch nicht neu codieren. man kann die korrigierte audiodatei dann einfach wieder mit z.B. Subler muxen.
 
Ja, mach mal...
 

Sorry, das dir meine Aussage missfällt, dann weiterhin viel Spaß mit deinem halbgaren Firkelösungen.

Ich hoffe nur das du das nicht beruflich machst, denn es gibt schon genug Filme und Serien die katastrophal produziert wurden.
 
Besser eine "halbgare Frickellösung" als ein nichtssagender Kommentar wie Deiner. :D Zu Deiner Enttäuschung muss ich sagen... doch ich mache das professionell.
 
Na toll, dann freue ich mich schon auf die nächsten Serien und Filme die ich für meine Mediathek nachkorrigieren muss.
 
In einer Situation ist Dein Argument schon richtig, nähmlich wenn es sich um einen Film von längerer Dauer handelt. Allerdings, wenn Du schon (bessere) Ideen hast, dann schreib doch schnell ein Script, das die Tonspur des Films extrahiert um einen bestimmten Zeitfactor streckt und die Tonhöhe um einen bestimmten Wert erhöht und danach gleich ein Dublikat des Films mit geänderter Tonspur ausgibt. Zu schwierig?
 
Zurück
Oben Unten