Frage Verwenden von ffmpeg zum Schneiden von Videos


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 -ss Teil funktioniert gut, aber die -t wird ignoriert. Es entfernt korrekt die angegebenen ersten Sekunden mit -ss aber dann geht es mit der Kopie an das Ende der Eingabe.

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


249
2018-05-06 14:12


Ursprung


Diese Syntax ist korrekt. - jiggunjer
stackoverflow.com/questions/18444194/... - Ciro Santilli 新疆改造中心 六四事件 法轮功


Antworten:


Du kannst den ... benutzen -ss Option, um einen Startzeitstempel anzugeben, und der -t Option zum Festlegen der Kodierungsdauer. Die Zeitstempel müssen drin sein HH:MM:SS.xxx Format oder in Sekunden (s.msec).

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

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 -t ist eine Ausgabeoption und muss immer angegeben werden nach  -i.

Einige Hinweise:

  • Für ältere ffmpeg-Versionen, wenn Sie verwenden -ss nach -i, erhalten Sie genauere Suche auf Kosten einer langsameren Ausführung insgesamt. Siehe auch: Suche mit FFmpeg
  • Sie können verwenden -to Anstatt von -t Geben Sie den Zeitstempel an, zu dem Sie schneiden möchten. Also, statt -i <input> -ss 30 -t 10 Du könntest es auch tun -i <input> -ss 30 -to 40 um dasselbe zu erreichen.

  • Wenn dein ffmpeg dies nicht unterstützt -c, oder -toEs ist wahrscheinlich sehr veraltet. Kompiliere eine neue Version selbst oder Lade einen statischen Build herunter von ihrer Homepage. Es ist wirklich nicht kompliziert.


301
2018-05-15 00:03



@Mondain Eigentlich bekommst du mehr Genauigkeit beim setzen der -ss nach. Und slhck erwähnt das hier blog.superuser.com/2012/02/24/...  auch in der ffmpeg-dokumentation für -ss erwähnt er einen unterschied zwischen der angabe vor oder nach. - barlop
+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
Dies funktioniert nicht für mich (mp4). Es produziert nur einen 5 Sekunden schwarzen Bildschirm: frame= 150 fps=0.0 q=-1.0 Lsize= 264kB time=00:00:09.97 bitrate= 216.6kbits/s - clocksmith
Dies erzeugte 3-4 s schwarzen Bildschirm am Anfang meines Videoclips. Chris 'Modifikation mit dem Weglassen -c copy entfernt den ursprünglichen schwarzen Bildschirm, siehe seine Antwort für Details. - Joel Ostblom
Du schreibst "Das Folgende würde die ersten 30 Sekunden abschneiden und dann alles abschneiden, was 10 Sekunden danach ist:" <- Was bedeutet das? Mit Clip meinst du include? 'cos clip kann bedeuten, ausschneiden. Angenommen du meinst mit einschließen. Meinst du Start ab 30 Sekunden, und nur 10 Sekunden von dort? Wenn dem so ist, schlage ich vor, dass Sie schreiben, dass es viel klarer wäre. - barlop


Wie andere Leute erwähnt haben, Putten -ss vor (viel schneller) oder nach (genauer) der -i macht einen großen Unterschied. Der Abschnitt "Schnell und genau suchen" auf der ffmpeg Suchseite sagt Ihnen, wie Sie beides bekommen, und ich habe es benutzt, und es macht einen großen Unterschied. Im Grunde stellst du -ss vor und nach dem -iStellen Sie sicher, dass Sie genügend Zeit haben, bevor Sie mit dem Schneiden beginnen, um einen anderen Schlüsselrahmen zu erhalten. Beispiel: Wenn Sie in Video.mp4 einen 1-Minuten-Clip erstellen möchten, von 9min0sec bis 10min 0sec, können Sie dies schnell und präzise tun:

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

Der Erste -ss sucht schnell (ungefähr) 8min0sec, und dann die Sekunde -ss sucht genau nach 9min0sec, und die -t 00:01:00 Nimmt einen 1min0sec-Clip heraus.

Beachten Sie auch diesen wichtigen Punkt auf dieser Seite: "Wenn Sie verwenden -ss mit -c:v copy, der resultierende Bitstream könnte am Ende abgehackt, nicht spielbar oder nicht synchron mit dem Audiostream sein, da ffmpeg gezwungen ist, nur I-Frames zu verwenden / aufzuteilen. "

Das bedeutet, dass Sie das Video erneut codieren müssen, auch wenn Sie es nur kopieren möchten, oder riskieren Sie, dass es abgehackt und nicht synchron ist. Du könntest es einfach versuchen -c copy zuerst, aber wenn das Video saugt, müssen Sie es erneut tun.


69
2018-01-20 04:07



die gleiche Warnung gilt für -c:a copy für diese Art zu suchen. - jiggunjer
Die beste Antwort, auf diese Weise funktionierte das Beste für mich. - Ondra Žižka


ich habe das gefunden -ss kombiniert mit -c copy führte zu einer halben Sekunde am Start.

Um dies zu vermeiden, müssen Sie das entfernen -c copy (was freilich eine Transcodierung macht).


17
2018-05-09 02:24



Es gibt eine andere Antwort, die sich mit Genauigkeit beschäftigt. Die Neucodierung mit der Standardoption ist oft NICHT das, was Sie tun möchten! - Tomasz Gandor
Guter Punkt @TomaszGandor - Chris
Ich habe @ TomaszGandors Antwort überhaupt nicht verstanden, aber entfernt -c copy behoben. - Iulian Onofrei


MANUELL

Öffnen Sie die Datei in einem Medienplayer, der Bild für Bild vorrückt und spielt ein 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 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"

12
2017-09-04 05:48





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

Die Befehlszeile, die für mich funktionierte, ist:

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

Übrigens Putten -ss vor -i macht einen großen Unterschied in der Ausführungszeit.


7
2018-05-19 03:14



Tatsächlich -vframes (oder -frames:v) sollte danach kommen -i weil es eine Ausgabeoption ist. - slhck


Wie bei user225366 funktioniert die Option -t nicht für kurze Videos, aber für längere Videos. Bei kurzen 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

- Eine Codec-Kopie muss hinzugefügt werden, wenn das Video Audio hat, wie die anderen Antworten zeigen.


1
2017-12-08 11:24