Verwenden von ffmpeg zum Schneiden von Videos

333

Ich verwende ffmpeg, um einen Abschnitt einer großen Datei wie folgt auszuschneiden:

ffmpeg -i input.wmv -ss 60 -t 60 -acodec copy -vcodec copy output.wmv

Das -ssTeil funktioniert gut, aber das -twird ignoriert. Die mit angegebenen Anfangssekunden werden korrekt entfernt, die -ssEingabe mit der Kopie wird jedoch bis zum Ende fortgesetzt.

Gibt es eine Möglichkeit, mit ffmpeg das Ende eines Videos abzuschneiden, ohne es neu zu codieren?

Neil
quelle
1
Diese Syntax ist korrekt.
Jiggunjer

Antworten:

394

Sie können die -ssOption verwenden, um einen Startzeitstempel und -tdie Kodierungsdauer anzugeben. Die Zeitstempel müssen im HH:MM:SS.xxxFormat oder in Sekunden ( s.msec) vorliegen .

Das Folgende würde die ersten 30 Sekunden beschneiden und dann alles, was 10 Sekunden danach ist, beschneiden:

ffmpeg -ss 00:00:30.0 -i input.wmv -c copy -t 00:00:10.0 output.wmv
ffmpeg -ss 30 -i input.wmv -c copy -t 10 output.wmv

Beachten Sie, dass -teine Ausgabeoption ist und muss immer angegeben werden , nach -i .

Einige Hinweise:

  • Wenn Sie ältere ffmpeg-Versionen -ssnachher verwenden -i, erhalten Sie eine genauere Suche auf Kosten einer insgesamt langsameren Ausführung. Siehe auch: Suche mit FFmpeg
  • Sie können -toanstelle von -tden Zeitstempel angeben, auf den Sie schneiden möchten. So -i <input> -ss 30 -t 10könnte man stattdessen auch -i <input> -ss 30 -to 40das Gleiche erreichen.

  • Wenn Ihr ffmpeg -coder nicht unterstützt , -toist es wahrscheinlich sehr veraltet. Kompilieren Sie selbst eine neue Version oder laden Sie einen statischen Build von der Homepage herunter . Es ist wirklich nicht kompliziert.

slhck
quelle
1
@Mondain Tatsächlich erhalten Sie mehr Genauigkeit beim Setzen des -ss nach. Und slhck erwähnt dies hier blog.superuser.com/2012/02/24/… auch in der ffmpeg-Dokumentation.
Barlop
5
+1 Ich kam hierher, um herauszufinden, wie man alles nach den ersten 35 Sekunden ignoriert, danke:ffmpeg -i input.wmv -c copy -t 35 output.wmv
karlphillip
2
Das funktioniert bei mir nicht (mp4). Es wird nur ein 5 Sekunden frame= 150 fps=0.0 q=-1.0 Lsize= 264kB time=00:00:09.97 bitrate= 216.6kbits/s
langer
2
Dies erzeugte 3-4 s schwarzen Bildschirm am Anfang meines Videoclips. Chris 'Modifikation mit dem Weglassen -c copyentfernte den anfänglichen schwarzen Bildschirm, siehe seine Antwort für Details.
Joelostblom
4
Sie schreiben "Folgendes würde die ersten 30 Sekunden beschneiden und dann alles, was 10 Sekunden danach ist, beschneiden:" <- Was bedeutet das? Mit Clip meinst du einschließen? cos clip kann clip out bedeuten. Angenommen, Sie meinen, enthalten. Meinst du "Start ab 30 Sekunden" und nur 10 Sekunden von dort? Wenn ja, dann schlage ich vor, dass Sie schreiben, dass es viel klarer sein würde.
Barlop
94

Wie andere Leute bereits erwähnten, macht das Setzen -ssvor (viel schneller) oder nach (genauer) dem -ieinen großen Unterschied. Im Abschnitt "Schnelles und genaues Suchen" auf der ffmpeg-Suchseite erfahren Sie, wie Sie beides erhalten, und ich habe es verwendet, und es macht einen großen Unterschied. Grundsätzlich stellen Sie -ssvor UND nach dem ein -i, lassen Sie jedoch genügend Zeit, bevor Sie mit dem Schneiden beginnen, um ein anderes Schlüsselbild zu erhalten. Beispiel: Wenn Sie einen 1-minütigen Clip von 9 Minuten bis 10 Minuten in Video.mp4 erstellen möchten, können Sie dies schnell und genau tun:

ffmpeg -ss 00:08:00 -i Video.mp4 -ss 00:01:00 -t 00:01:00 -c copy VideoClip.mp4

Der erste -sssucht schnell nach (ungefähr) 8 Minuten pro Sekunde, und der zweite -sssucht genau nach 9 Minuten pro Sekunde, und der -t 00:01:00entnimmt einen 1-Minuten-Clip.

Beachten Sie auch diesen wichtigen Punkt auf dieser Seite: "Wenn Sie -ssmit verwenden -c:v copy, wird der resultierende Bitstream möglicherweise abgehackt, kann nicht wiedergegeben werden oder ist nicht mit dem Audiostream synchron, da ffmpeg nur für i-Frames verwendet / aufgeteilt werden muss. "

Dies bedeutet, dass Sie das Video neu codieren müssen, auch wenn Sie es nur kopieren möchten, oder die Gefahr besteht, dass es abgehackt und nicht synchron ist. Sie könnten es einfach -c copyzuerst versuchen , aber wenn das Video nicht funktioniert, müssen Sie es erneut ausführen.

seriesoftubes
quelle
Die gleiche Warnung gilt -c:a copyfür diese Art des Suchens.
Jiggunjer
1
Die beste Antwort, dieser Weg hat für mich am besten funktioniert.
Ondra Žižka
3
Es scheint, dass "-ss" jetzt in ffmpeg 2.1+ schnell und genau ist, ohne es zweimal anzugeben. trac.ffmpeg.org/wiki/Seeking
Conrad Meyer
25

Ich fand, dass in -ssKombination mit -c copyzu Beginn eine halbe Sekunde Chop resultierte.

Um dies zu vermeiden, müssen Sie das entfernen -c copy(was zugegebenermaßen eine Transcodierung bewirkt).

Chris
quelle
4
Es gibt eine andere Antwort, die sich mit Genauigkeit befasst. Eine Neucodierung mit der Standardoption ist oft NICHT das, was Sie tun möchten!
Tomasz Gandor
Guter Punkt @TomaszGandor
Chris
1
Ich habe die Antwort von @ TomaszGandor überhaupt nicht verstanden, aber das Entfernen hat es -c copybehoben.
Iulian Onofrei
14

MANUELL

Öffnen Sie die Datei in einem Mediaplayer, der Bild für Bild vorrückt, und geben Sie eine AVISynth-Datei mit folgenden Daten wieder:

DirectShowSource(("C:\Downloads\Video\Do you want him.flv"), Pixel_Type="yuy2").Crop(0,0,-0,-0)
Subtitle("C:\Downloads\Video\Do you want him.flv", font="Arial", size=24, text_color=$ff0000, align=3)
ShowFrameNumber(scroll=true, x=336, y=27, font="Arial", size=24, text_color=$ff0000)
ShowTime(x=398, y=44, font="Arial", size=24, text_color=$ff0000)

Dann schneiden Sie mit dem GENAUEN Zeitformat:

ffmpeg -i "Path\do you want him.flv"        \
       -ss 00:00:05.240 -to 00:00:08.360    \
       -vcodec libx264 -acodec libvo_aacenc \
       "Path\Do you want him1.flv"

und

ffmpeg -i "Path\do you want him.flv"        \
       -ss 00:00:10.240 -to 00:00:14.360    \
       -vcodec libx264 -acodec libvo_aacenc \
       "Path\Do you want him2.flv"

Erstellen Sie nun eine txt-Datei mit den Videodateien mit Inhalten wie:

file 'C:\Downloads\Video\Do you want him1.flv'
file 'C:\Downloads\Video\Do you want him2.flv'

Führen Sie ffmpeg aus:

ffmpeg -f concat -i FileList.txt -c copy "Path\NewName_joined.flv"
Budman1
quelle
9

Für mich hat die -tOption nicht funktioniert, hat aber -vframesfunktioniert. Ich bevorzuge die Verwendung #frames, da ich lieber bei I-Frames schneiden würde und GOP für die Verwendung von Videos herausgefunden habe ffprobe.

Die Kommandozeile, die bei mir funktioniert hat, ist:

ffmpeg -ss 60s -i input.wmv -vframes 1800 -acodec copy -vcodec copy output.wmv

Übrigens macht -ssdas -iVorrücken einen großen Unterschied in der Ausführungszeit.

Ben
quelle
1
Eigentlich sollte -vframes(oder -frames:v) danach kommen, -iweil es eine Ausgabeoption ist.
Slhck
5

Wie bei user225366 funktioniert die Option -t nicht für kurze Videos, aber für längere Videos. Für kurze Videos scheint -frames: v besser zu sein. Das hat bei mir funktioniert.

ffmpeg -ss 4 -i input.mp4 -frames:v 200 -vcodec copy output.mp4

-acodec-Kopie muss hinzugefügt werden, wenn das Video Audio enthält, wie die anderen Antworten zeigen.

VectorVortec
quelle
0

Ich sehe nicht viele, die das erwähnen (ich bin kein Experte, also gibt es vielleicht einen Haken), aber wenn Ihre Datei andere Streams wie Untertitel und andere Metadaten wie Kapitel und so weiter hat, ist es möglich, alle Streams mit dem auszuschneiden / zuzuschneiden und zu behalten folgenden Befehl

ffmpeg -to 60 -i input.mkv -map 0 -c copy output.mkv

Mit -map 0ihr nehmen alle Ströme in der Datei und mit -c copyIhnen allen , sie zu kopieren , wie sie sind.
Wenn Sie -toden Start über weglassen, -sswird das Eingangsvideo vom Start bis zur 60. Sekunde abgeschnitten.

Das Herumspielen mapist auch nützlich, wenn Sie möchten, dass nur bestimmte Streams im Schnitt bleiben (möglicherweise benötigen Sie nicht alle Audioquellen in der Datei oder nur einige Untertitel).

Ich benutze dies, wenn ich große MKV-Dateien aufteilen muss, die nicht im FAT32-Speicher gespeichert werden können.

Gruber
quelle