Allllssssssooooooooo....
Man kann beim verlustlosen Schneiden von Videos (und das betrifft
ALLE Videoformate) nur bis zu einem Keyframes schneiden. Warum das so ist, kann man bei
Brother John's Encodingwissen nachlesen. Ist auch ganz logisch: Keyframes = I-Frames (Intraframes). Sie enthalten den
kompletten (!) Bildinhalt... komprimiert ähnlich wie JPEG Bilder. P-Frames und B-Frames hingegen enthalten nur
Bildunterschiede und
nicht den gesamten Bildinhalt. Ein Schnitt kann also nicht bis (sagen wir mal) zu einem P-Frame gehen - damit würde man dem P-Frame ja das vorhergehende Frame "wegnehmen" auf das es sich bezieht. Die Folge wären grausame Bildfehler, die sich weiter verschlimmern würden, bis das nächste Keyframe kommt (das ja wieder das komplette Bild enthält). Sowas kennt jeder, der schonmal eine defekte AVI hatte (da gibt's dann an der defekten Stelle "lustige" Schlieren, verzogene Farben und Formen usw.). Darum erlaubt VirtualDub kein beliebiges Schneiden bei eingestellter "Direct stream copy". Klar soweit (?)...
Das Problem bei der Sache ist: XviD oder DivX setzen die Keyframes nach Bedarf. Meist bei Szenenwechseln (da dort die größten Unterschiede zum vorhergehenden Frame sind) - im Codec selbst kann man aber meist noch einstellen, nach wievielen Frames
maximal wieder ein Keyframe kommen
soll. Bei XviD nennt sich das "Maximum I-Frame Intervall" und steht standardmäßig auf 300. Das heißt: wenn der Codec 300 Frames lang keinen Grund sah ein Keyframe zu setzen, wird trotzdem eins gesetzt. Ergo: es kann schonmal etwas "dauern", bis das nächste Keyframe kommt.
Um doch
beliebig schneiden zu können, müßte man entweder den kompletten Film reencoden (= zeitaufwändig + Qualitätsverlust)
oder halt nur ein Stück Film bis zum nächsten Keyframe encoden und das einfügen.
Und da der Mensch ein sehr visuell veranlagtes Wesen ist
: - mal ein Beispiel...
Angenommen, das ist ein Film (die verschiedenen Framearten bitte bei Brother John nachlesen):
Und von diesem Film will ich per "Direct stream copy" das hier rausschneiden:
Wer die Erklärung durchgelesen hat, weiß aber:
DAS GEHT NICHT! Der Schnitt würde mitten zwischen zwei P-Frames gehen - und sowas ist nicht zulässig.
Es ginge nur das:
... oder alternativ das :
Jetzt
will ich aber
unbedingt das Stück im oberen Beispiel rausschneiden. Und dafür gibt's nur zwei Möglichkeiten:
- Ich schneide in VirtualDub - stelle aber nicht auf "Direct stream copy", sondern encode den kompletten Film neu. So werden die Keyframes beim Encoden neu gesetzt. Nachteil: Qualitätsverlust & Zeitaufwand.
- Ich schneide nur ein Stück raus (und zwar so weit wie ich darf) und encode vom Rest (Rest = alle Frames bis zum nächsten Keyframe) nur die Frames, die ich brauche:
Da hier alles einzelne Schritte sind, ist's allerdings nötig, das Ergebnis manuell zusammenzustückeln. Das heißt: den ersten unveränderten schwarzen Block (bis zum grünen Rahmen) in VirtualDub laden, den neu encodeten blauen Block per "Append AVI segment" dranhängen und den letzten (ebenfalls unveränderten) schwarzen Block per "Append AVI segment" an den Schluß dranhängen.
Das Problem hierbei: man muß den blauen Block mit exakt den gleichen Einstellungen neu encoden, wie den schwarzen Block. Ansonsten weigert sich VirtualDub die Stücke zusammenzufügen (bei zu starken Abweichungen in der Bitrate), oder es gibt Bildfehler (wenn man Einstellungen wählt, die im Original nicht gewählt waren... wie GMC & Co.).
Eindeutiger Vorteil des Ganzen: da nur ein Bruchteil des Videos neu encodet wird geht's viel schneller und der restliche Film wird qualitätsmäßig nicht verändert!
Also wie gesagt: es geht so... das
beliebige Schneiden einer AVI. Leider gibt's dafür keine automatisierte Lösung. Zumindest nicht bei AVIs. Bei MPEG2-Dateien sieht's da anders aus: das Problem ist grundsätzlich das gleiche. Allerdings gibt's Tools, die das Reencoden dieser notwendigen kleinen Stücke beim Schneiden selbst übernehmen. Beispiele dafür wären: das kostenlose Cuttermaran (welches TMPGEnc oder QuEnc zum Reencoden benutzt) oder das kostenpflichtige MPEG2VCR (welches wohl selbst Encoden kann).