Videos genau teilen und mit ffmpeg kombinieren, wobei Inpoint / Outpoint beachtet wird

620
watkipet

Ich lerne, Videos mit zu teilen und zu kombinieren ffmpeg. Momentan übe ich eine 799-KB-MP4-Datei, one_through_ten-timestamped.mp4bei der jeder Frame eine "Frame-Nummer" (bis Frame 40) hat (die Burn-In-Nummer erhöht sich nur um jeden Frame).

Der Befehl, den ich verwende, lautet:

ffmpeg -f concat -i one_through_ten_edit_list.txt -c copy one_through_ten_edited.mp4 

Wo one_through_ten_edit_list.txtist:

file one_through_ten-timestamped.mp4 inpoint 00:00:01.500 outpoint 00:00:05.000 file one_through_ten-timestamped.mp4 inpoint 00:00:09.500 outpoint 00:00:13.000 

Wenn ich diesen Befehl im ffmpegAusgabevideo durchführe, gibt es mehrere Probleme:

  1. Die Ausgabe beginnt am Anfang des Quellvideos statt in 1,5 Sekunden.
  2. Das Audio nach dem Verketten des zweiten Eingangsvideos ist verzögert (wenn es in QuickTime Player abgespielt wird. Es ist in Ordnung ffplay).

Wenn ich diese Änderungen in MPEG Streamclip durchführe, wird das resultierende Video wie erwartet abgespielt . Hier einige tabellarische Ausgabe von ffprobeauf one_through_ten-timestamped.mp4die zeigt, wo die ffmpeg - Video und MPEG Stream in ihrer Verkettung Punkte unterscheiden:

Beginn des ersten Segments Ende des ersten Segments mpeg streamclip start 1 Beginn der zweiten Segmente Ende des zweiten Segments

Beachten Sie, dass sowohl der ffmpegMPEG-Streamclip als auch der MPEG-Streamclip das zweite Segment in etwa gleich behandeln, ffmpegdas inpointim ersten Eingabevideo jedoch nicht zu berücksichtigen scheint . Beachten Sie, dass es in meinem MP4 ein Paket pro Frame gibt.

ffmpeghat sich von Version 2.8 (vielleicht vorher) bis 3.3.3 so verhalten. Fehlt mir eine Befehlszeilen- oder Bearbeitungslistenoption? Sicherlich haben andere erfolgreich ffmpegVideos geteilt und kombiniert (ohne sie erneut zu komprimieren).

1
Aus der [concat demuxer-Dokumentation] (https://ffmpeg.org/ffmpeg-formats.html#concat): "inpoint - Diese Direktive funktioniert am besten mit Intra-Frame-Codecs, denn für Nicht-Intra-Frame-Codecs erhalten Sie normalerweise zusätzliche Pakete vor dem eigentlichen In-Punkt und der dekodierte Inhalt enthält höchstwahrscheinlich auch Frames vor In-Punkt. " LordNeckbeard vor 6 Jahren 0

0 Antworten auf die Frage