2010-05-06 14:12:17 +0000 2010-05-06 14:12:17 +0000
357
357

Ich verwende ffmpeg, um ein Video zu schneiden

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

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

Der Teil -ss funktioniert gut, aber der Teil -t wird ignoriert. Er entfernt korrekt die anfänglich mit -ss angegebenen Sekunden, geht dann aber mit der Kopie weiter bis zum Ende der Eingabe.

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

Antworten (7)

105
105
105
2014-01-20 04:07:24 +0000

Wie von anderen erwähnt, macht es einen großen Unterschied, ob man -ss vor (viel schneller) oder nach (genauer) dem -i setzt. Im Abschnitt “Fast And Accurate Seeking” auf der ffmpeg-Suchseite erfahren Sie, wie Sie beides bekommen, und ich habe es benutzt, und es macht einen großen Unterschied. Im Grunde genommen setzt man -ss vor UND nach der -i, man muss nur genügend Zeit davor lassen, wo man mit dem Ausschneiden beginnen möchte, um einen weiteren Schlüsselrahmen zu erhalten. Beispiel: Wenn Sie einen 1-minütigen Clip von 9min0sek bis 10min 0sek in Video.mp4 machen wollen, könnten Sie dies sowohl schnell als auch genau tun, indem Sie Folgendes verwenden:

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

Die erste -ss sucht schnell auf (ungefähr) 8min0sek, und dann sucht die zweite -ss genau auf 9min0sek, und die -t 00:01:00 nimmt einen 1min0sek langen Clip heraus.

Beachten Sie auch diesen wichtigen Punkt auf dieser Seite: “Wenn Sie -ss zusammen mit -c:v copy verwenden, könnte der resultierende Bitstream am Ende abgehackt, nicht abspielbar oder nicht synchron mit dem Audiostrom sein, da ffmpeg gezwungen ist, nur auf i-Frames zu verwenden/aufzusplitten.”

Dies bedeutet, dass Sie das Video neu kodieren müssen, selbst wenn Sie es nur kopieren wollen oder riskieren, dass es abgehackt und nicht synchron ist. Sie könnten es zuerst mit -c copy versuchen, aber wenn das Video schlecht ist, müssen Sie es neu kodieren.

27
27
27
2014-05-09 02:24:58 +0000

Ich fand heraus, dass -ss in Kombination mit -c copy zu einem Halbsekunden-Hackel am Anfang führte.

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

13
13
13
2014-09-04 05:48:57 +0000

MANUELL

Öffnen Sie die Datei in einem Media-Player, der Bild für Bild vorrückt, und spielen Sie eine AVISynth-Datei mit Daten wie:

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 EXAKTEN 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'

Ausführen von ffmpeg:

ffmpeg -f concat -i FileList.txt -c copy "Path\NewName_joined.flv"
8
8
8
2013-05-19 03:14:56 +0000

Für mich hat die Option -t nicht funktioniert, aber -vframes hat funktioniert. Ich bevorzuge die Option #frames, da ich lieber bei I-Frames schneiden würde und ich mit ffprobe GOP für Video herausgefunden habe.

Die Befehlszeile, die bei mir funktioniert hat, lautet:

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

Übrigens, wenn man -ss vor -i setzt, macht das einen großen Unterschied in der Ausführungszeit.

5
5
5
2016-12-08 11:24:57 +0000

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 copy muss hinzugefügt werden, wenn das Video Ton enthält, wie die anderen Antworten zeigen.

0
0
0
2020-02-12 02:20:00 +0000

verwenden Sie dieses Format:

ffmpeg <start time> <input file> <cut duration> <out file>

z.B. 60 Sekunden Clip nach 1 Minute Video schneiden

ffmpeg.exe -ss 00:01:00 -i "in file.mp4" -to 00:01:00 -c copy out.mp4

0
0
0
2019-09-01 05:29:02 +0000

Ich sehe nicht viele, die dies 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 folgenden Befehl

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

zu schneiden/zurechtzuschneiden und beizubehalten: Mit -map 0 nehmen Sie alle Streams in der Datei, und mit -c copy kopieren Sie alle so, wie sie sind.
Wenn Sie -to verwenden und den Anfang über -ss weglassen, wird das Eingabevideo von Anfang bis Sekunde 60 geschnitten.

Das Fummeln mit map ist auch dann nützlich, wenn Sie nur bestimmte Streams im Schnitt behalten wollen (vielleicht brauchen Sie nicht alle Audioquellen in der Datei oder nur einige Untertitel).

Ich verwende dies, wenn ich große MKV-Dateien splitten muß, die nicht im FAT32-Speicher abgelegt werden können.