Ist es möglich, mit ffmpeg X Sekunden ab dem Beginn eines Videos mit einer nicht festgelegten Länge abzuschneiden?


20

Ich muss nur die ersten 1 oder 2 Sekunden einer Reihe von FLV-Aufnahmen unterschiedlicher, nicht spezifizierter Länge abschneiden. Ich habe viele Ressourcen zum Extrahieren einer bestimmten Dauer aus einem Video gefunden (z. B. 30-Sekunden-Clips), aber keine, um bis zum Ende eines Videos fortzufahren.

Diese beiden Versuche ergeben lediglich eine kopierte Version des Videos ohne den gewünschten Zuschnitt:

ffmpeg -ss 2 -vcodec copy -acodec copy -i input.flv output.flv

ffmpeg -ss 2 -t 120 -vcodec copy -acodec copy -i input.flv output.flv

Der Gedanke an den zweiten war: Wenn ich vielleicht eine Länge spezifizierte, die über das Mögliche hinausging, ging sie einfach zu Ende. Kein Würfel.

Ich weiß, dass es kein Problem mit Codecs oder der Verwendung von Sekunden anstelle von Timecode gibt, da das Folgende einen Reiz hat:

ffmpeg -ss 2 -t 5 -vcodec copy -acodec copy -i input.flv output.flv

Irgendwelche anderen Ideen? Ich bin offen für die Verwendung anderer (Windows-basierter) Befehlszeilentools, bevorzuge jedoch ffmpeg, da ich es bereits für die Erstellung von Miniaturansichten verwende und mit ihm vertraut bin.

Wenn es hilft, werden meine Videos alle unter 2 Minuten sein.

AKTUALISIEREN:

Ich bin auf Mencoder umgestiegen ( http://www.mplayerhq.hu/ ), da es so aussieht, als würde ffmpeg dies nicht ohne zusätzliche Hacks erreichen.

Die Mencoder-Syntax für das, was ich mir vorgenommen habe, lautet:

mencoder.exe -ss 2 -oac copy -ovc copy input.flv -o output.flv

Also, welche bevorzugen Sie? das mencoderobige Beispiel; oder das ffmpegBeispiel unten?
Stimmen

Antworten:


16

Versuchen:

ffmpeg -i input.flv -ss 2 -vcodec copy -acodec copy output.flv

Ich denke, der Eingabeparameter soll an erster Stelle stehen.


Danke für die Antwort. Die oben verwendete Parameterreihenfolge liefert das gleiche Ergebnis, daher glaube ich nicht, dass es die Reihenfolge ist. Nachdem ich ffmpeg aufgegeben hatte, verursachte mein Keyframe-Intervall Probleme mit anderen Tools. Nachdem ich das gerade noch einmal durchgesehen hatte, war es immerhin das Keyframe-Intervall. Es war auf 5 Sekunden eingestellt und ich habe es seitdem auf 1 Sekunde eingestellt. Nach 5 Sekunden lieferten sowohl Ihr Befehl als auch die, die ich oben ausprobiert habe, am Anfang schwarzen Raum (3 Sekunden, nicht überraschend). Nach 1 Sekunde funktioniert es wie erwartet.
marcelebrate

Dies funktioniert auch für
MP3s

4
Wie in FFmpeg-Suche erläutert , wird bei Verwendung von -ss als Eingabeparameter (vor -i) beim Kopieren oder sogar beim Transcodieren mit einer älteren Version von FFmpeg die Suche nach Keyframes verwendet. Dies ist viel schneller, beeinträchtigt aber die Genauigkeit. Wenn Sie ihn als Ausgabeparameter verwenden, ist der Prozess möglicherweise viel langsamer (die Eingabe wird auch für die verworfenen Teile Frame für Frame decodiert), aber genau. Obwohl die Frage alt ist, denke ich, dass dies die akzeptierte Antwort sein sollte.
Jonathan Y.

23

Stellt sich heraus , diesen Befehl wird das Video von 2 Sekunden trimmen, wie erwartet:

ffmpeg -i input.flv -ss 2 -vcodec copy -acodec copy output.flv

Das Problem war das Keyframe-Intervall in der Datei input.flv. Es wurde auf 5 Sekunden eingestellt, was zu Beginn des Videos einen Wert von 3 Sekunden für schwarze Rahmen ergab (5 - 2 = 3). Ich habe seitdem mein Keyframe-Intervall auf 1 Sekunde geändert, obwohl 2 Sekunden in meinem Fall wahrscheinlich auch die gewünschten Ergebnisse bringen würden.

UPDATE: Die Reihenfolge -iund die -ssParameter wurden gemäß Daves Antwort aktualisiert , die ich als Gutschrift akzeptiert habe.


2
Ich hatte auch dieses Problem. Dieser Beitrag hat es für mich getan. Ich habe in die Kugel gebissen und aufgehört, -vcodec copy -acodec copyalle meine Bearbeitungsbefehle auszuführen. Die Neukodierung verhinderte, dass die schwarzen Frames zu Beginn meines Videos angezeigt wurden oder nicht an der richtigen Stelle geschnitten wurden (die Differenz von einer Sekunde ohne Neukodierung führte zu einer Differenz von fast 5 Sekunden im Video). Also habe ich ersetzt -vcodec copydurch -vcodec libx264 -crf 0.
Hendy

2
Ich bin gerade auf dasselbe gestoßen. Ich habe festgestellt, dass ich das nicht kann, nur -vcodec copyweil das Slice nicht auf einem Keyframe startet. Ich habe für N Sekunden ein Standbild oder ein schwarzes Bild bis zum nächsten Keyframe erhalten. Wenn ich tatsächlich neu codiere und nicht kopiere, funktioniert es wie erwartet. Also, obwohl meine Eingabe und Ausgabe beide H264 sind, musste ich immer noch neu codieren (mit -vcodec libx264anstelle von -vcodec copy).
Karl Wilbur

Daves Antwort ist die richtige ab der neuesten Version von ffmpeg. Das -isollte vor dem kommen -ss.
Arete

0

Benutze -ss und -to bevor -i wie folgt:

ffmpeg -ss 00:01:10 -to 00:02:10 -i input -c copy output

0

Aktualisierung dieser Antwort, ab 2019 lautet der Befehl jetzt:

ffmpeg -i input.flv -ss 2 -c copy output.flv
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.