iMovie (nicht verlustfrei, aber besser als zuvor)
iMovie v10 (das einige Zeit nach der ursprünglichen Beantwortung der Frage veröffentlicht wurde) verarbeitet jetzt besser mehr Medientypen. Dadurch wird das erneute Codieren des Imports für die meisten H.264-Inhalte (mp4, m4v, mov, AVHDC, mts, mt2s) vermieden.
Es wird jedoch beim Export immer noch neu codiert, sodass es technisch nicht verlustfrei sein kann. Eine weitere Neuerung ist jedoch die Möglichkeit, die Exportqualität anzupassen, die nahezu verlustfrei sein kann. Ich vermute, dass dieser Teil der Antwort auch für andere "projektgesteuerte" Videobearbeitungssoftware (z. B. Premiere oder Final Cut) gilt, da sie meiner Meinung nach bei der Ausgabe generell alle neu codiert werden, obwohl sie normalerweise für präzises Zuschneiden sehr einfach zu verwenden sind.
Persönlich denke ich im Allgemeinen, dass eine einzelne Neukodierung kein großes Problem ist, aber Sie haben nach einer verlustfreien Lösung gefragt, also ...
Verlustfrei (aber viel komplizierter!)
Es gibt technische Einschränkungen, wie genau Sie ein Video schneiden können, ohne mindestens einen Teil davon neu codieren zu müssen, und dies hängt im Wesentlichen von der Frequenz des i-Frames ab. Wenn jedes Bild ein i-Bild ist, können Sie überall schneiden, aber wenn es nur alle paar Sekunden ist, können Sie nur verlustfrei an diesen i-Bildern schneiden, ohne dass Inhalte verloren gehen oder neu codiert werden müssen (zumindest ein Teil der Stream), damit es mit einem i-Frame beginnen kann.
ffmpeg
Diese SO- Fragen und Antworten werfen speziell die Frage auf, wie zwischen i-Frames mit geschnitten werden kann ffmpeg
. Ich kenne keine GUI-Apps, um dies zu tun, aber im Grunde führen Sie einen Befehl wie den folgenden aus:
ffmpeg -i input.m4v -vcodec copy -acodec copy -ss 00:01:20.000 -t 00:37:50.000 output.m4v
Die beiden angegebenen Zeiten sind start und duration . Sie können entweder als seconds oder hh:mm:ss.ss
als and angegeben werden. Mit -acodec copy
and wird -vcodec copy
ffmpeg angewiesen, nicht erneut zu codieren.
Ich bin mir nicht ganz sicher, was passiert, wenn Sie zu früh schneiden, aber ich denke, das Video ist im Wesentlichen leer (oder, je nach Player, beschädigt), bis es auf einen i-Frame stößt. Sie möchten also wahrscheinlich den nächsten i-Frame vor Ihrem Schnitt finden. Diese Antwort löst das Problem mit ffprobe
und awk
, wenn auch etwas umständlich. Im Wesentlichen ffprobe
scannen Sie die Frames und finden den nächsten Keyframe ( flags=K
) vor Ihrem idealen Schnittpunkt. Die vollständige Ausgabe für jedes Bild des Videos sieht folgendermaßen aus:
ffprobe -select_streams v -show_frames <INPUT>
Die verknüpfte Antwort liefert diesen Befehl, um einen Keyframe vor einer bestimmten Zeit zu finden:
ffprobe -select_streams v -show_frames -v quiet INPUT.mp4 |
awk -F= '
/pict_type=/ { if (index($2, "I")) { i=1; } else { i=0; } }
/pkt_pts_time/ { if (i && ($2 >= 150)) print $2; }
' | head -n 1
Und wenn Sie wirklich irgendwo zwischen zwei i-Frames schneiden müssen, können Sie das Video aufteilen und erneut verbinden. Basierend auf den Informationen aus dieser Antwort sollte es ungefähr so aussehen:
ffmpeg -f concat -i list_of_videos.txt -c copy OUTPUT.mp4
Wo list_of_videos.txt
ist eine einfache Textdatei, in der die Dateien aufgelistet sind, die Sie verketten möchten?
Zusammenfassung
iMovie ist wahrscheinlich für die meisten Fälle gut genug (seit Version 10) und sehr einfach.
ffmpeg kann es verlustfrei (oder fast verlustfrei) mit ein bisschen Geigen machen; Der Schwierigkeitsgrad hängt davon ab, wie wählerisch Sie in Bezug auf den genauen Ausgangspunkt und die Häufigkeit von i-Frames sind.