Videos per Batch mit ffmpeg zeitgenau schneiden

  • Ersteller Ersteller Caspian DeConwy
  • Erstellt am Erstellt am
C

Caspian DeConwy

Gast
Hallo,

ich habe 109 Videos, die ich gerne mit individuellen Zeitstempeln in jeweils ca. 10 Videos schneiden möchte. Das ganze wollte ich mit ffmpeg per Batch erledigen wie folgt:
Code:
ffmpeg -i "Teil 1.mp4" -vcodec copy -acodec copy -ss 00:00:00 -to 00:33:25 "Teil 1-1.mp4"
ffmpeg -i "Teil 1.mp4" -vcodec copy -acodec copy -ss 00:33:25 -to 00:47:58 "Teil 1-2.mp4"
ffmpeg -i "Teil 1.mp4" -vcodec copy -acodec copy -ss 00:47:58 -to 00:59:03 "Teil 1-3.mp4"
Jetzt habe ich nur das Problem, dass es immer einen kleinen Hakler gibt beim Übergang zweier Videos, da ja wie in obigem Beispiel die Endzeit des ersten Videos gleich der Startzeit des zweiten Videos ist.
Wenn ich das Zweite Video eine Sekunde später schneide, fehlt mir eine Sekunde.

Jetzt hab ich schon festgestellt, dass ich auch im Hundertstel-Bereich schneiden kann, nur wie lege ich jetzt das korrekte Intervall fest? Wenn die Videos mit 25 Bildern/Sekunde laufen, muss ich dann 1/400 nehmen? Also quasi:
Code:
ffmpeg -i "Teil 1.mp4" -vcodec copy -acodec copy -ss 00:00:00.00 -to 00:33:25.00 "Teil 1-1.mp4"
ffmpeg -i "Teil 1.mp4" -vcodec copy -acodec copy -ss 00:33:25.04 -to 00:47:58.00 "Teil 1-2.mp4"
ffmpeg -i "Teil 1.mp4" -vcodec copy -acodec copy -ss 00:47:58.04 -to 00:59:03.00 "Teil 1-3.mp4"
Bei >1000 Videos kann ich das nur stichprobenhaft prüfen - daher wäre ich gerne vorher sicher, dass das klappt. Evtl. kann man auch Frames definieren?
 
Nutze am Besten die Frames und die Framerate als Ausgangsbasis und berechne damit die entsprechenden Zeiten.

Schnitt bei Frame: 2500
Teile 1: 2500/25 = 100,000 s -> -ss 0 -to 100,000
Teile 2: 2501/25 = 100,040 s -> -ss 100,040 -to ...
 
Hmm du encodest die Videos nicht neu und willst framegenau schneiden?
Kommen die Probleme bei den Übergangen evtl. davon dass das nächste Video nicht immer mit einem i-Frame anfängt und den drauf aufbauenden folgenden paar Frames die Informationen von dem vorigen abgeschnittenen i-frame fehlen?

Welcher Videocodec steckt denn in den Mp4s genau?
Meintest du mit Hakler Artefakte?
 
Scientist schrieb:
Nutze am Besten die Frames und die Framerate als Ausgangsbasis und berechne damit die entsprechenden Zeiten.
Dann müsste ich zu jedem Schnittpunkt aller Videos die Frames kennen; ich dachte es geht vielleicht andersrum, dass ich eine Zeit angebe - wie im Code - und dann sage +1 Frame o.ä. für den Startpunkt des nächsten Videos.

@Schalk666: ich will einfach nahtlose Übergänge; das meine ich mit Haklern - aktuell fehlt mir entweder ein Bruchstück zwischen zwei Videos oder ich habe einen Teil doppelt.

GSpot zeigt als Codec: avc1, H.264/MPEG-4 AVC
 
Also du musst die Bilder angeben, an denen es schneiden soll. Außerdem müssen die Bilder an denen du schneiden willst Intra-Bilder sein, weil du ja nicht neu codieren willst. Am besten benutzt du ein Programm, mit dem du von Intra-Bild zu Intra-Bild Springen kannst, um die die Intra-Bilder zu finden.
"If you want to extract just a limited number of frames, you can use the above command in combination with the -frames:v or -t option, or in combination with -ss to start extracting from a certain point in time."

Soweit ich das sehe, musst du also mit -frames:v xxx das Intra-Bild angeben.
 
Durch "-vcodec copy -acodec copy" wird ein reencode verhindert (oder "-c copy" fuer alles).
Das steht dann auch so in der Commandozeile (Stream xy copy)
Wenn man nun schneidet, wird automatisch am naechsten i-frame geschnitten.
Allerdings zerkloppt mir der Befehl den Anfang jeder Datei. Unabhaengig davon, ob ich direkt am i-frame schneide ...

Ich schau mir das spaeter noch einmal an ...

Falls MKV eine alternative darstellt (oder vielleicht als wuerg-around):
Mit MKVToolnix hatte ich nie Probleme.
Entsprechend koennte man die Videos ueber mkvmerge schneiden und dann in mp4 konvertieren.
Wobei man die MKV-Dateien theoreatisch verlinken kann.
D.h., wenn man eine Datei oeffnet, wuerde der Player alle als ein Video laden.
Ich hab aber keine Erfahrung beim Erstellen solcher Dateien.
 
Mit schneiden hab ich mich noch nie wirklich beschäftigt, ich hab Videos wenn dann gleich komplett neu gerendert oder nach einmal anschauen weggelöscht.
Aber ich würd das mit einer der vielen GUIs machen und nicht per Consolenbefehl was mir arg umständlich / arbeitsaufwändig / "human error anfällig" erscheint.
Staxrip fand ich recht gut, hab damit mal ne Menge Videos auf h264 runtergerechnet, glaub eine rudimentäre Schnittfunktion hat das auch, aber was dafür am besten geeignet ist weiß ich nicht.

Edit: eine Ramdisk ist bei Videobearbeitung für Temp-Daten richtig nice (weniger Stress für die Festplatten), aber schneiden wird immer recht aufwändig, weil man die Start/Stop Timings suchen und neue Dateinamen manuell vergeben muss.
 
Zuletzt bearbeitet:
Ich danke euch.

Ich denke, ich belasse es erstmal bei meiner oben geposteten Lösung. Es geht hier nur um TV-Aufnahmen, die ich eben stückeln will. Es ist keine Katastrophe, wie es aktuell herauskommt, man merkt halt kurz einen Aussetzer.

Da ich die ganzen Zeitstempel schon habe geht das per Batch für alle 109 Videos in unter 1 Minute. Per GUI schneiden dauert mir das zu lange - das habe ich nach dem ersten Video gemerkt ;)
 
Mh, ich hab mich geirrt ...
"-ss" kann entweder framegenau schneiden oder am Keyframe (je nach Position im Befehl, nach "-i" oder davor). Wenn man aber framegenau schneidet, kann es zu Bildaussetzern kommen, weil halt die Informationen fehlen.
"-t"/"-to" schneidet scheinbar nur genau ..
Wenn also Ende und Anfang zusammenpassen sollen, muss man die Keyframes auslesen und sich passende raussuchen.

Oder wie geschrieben mit mkvmerge arbeiten.

Code:
mkvmerge --split timestamps:00:30:00.000,01:00:00.250 -o output.mkv input.mkv
-> output-001.mkv, output-002.mkv, output-003.mkv
ffmpeg  -i "output-00x.mkv" -c copy output-00x.mp4

Und dann mit "del" die MKVs loeschen ...
Der Split funktioniert auch anhand der Dateigroeße oder Kapitel.
 

Ähnliche Themen

Zurück
Oben