Ich versuche, FFmpeg zu verwenden, um Videos basierend auf einigen start_time
und end_time
Eingaben zu teilen und diese durch andere Videodateien zu ersetzen. Zum Beispiel muss 10 15
ich für die Eingabe GENAUE Sekunden 10 to 15
durch ein anderes Video ersetzen .
OK. Was mir in den Sinn kommt, ist Folgendes:
- Teilen Sie zuerst das Video (in diesem Fall 0-10, 10-15 und 15-Ende).
- Ersetzen Sie die 10-15 durch das andere Video
- Füge alle Untervideos wieder zusammen
Erste Frage: Ist dies die beste und schnellste Lösung? Haben wir einen einfacheren Befehl oder andere Tools, um einen bestimmten Zeitraum im Video durch ein anderes Video zu ersetzen?
Zweite Frage: Angenommen, FFmpeg ist die praktikable Lösung. Wenn ich einfach den Befehl verwende ffmpeg -I input.video -ss 10 -t 5 -c copy output.mp4
, kann mein Videoverarbeitungscode die Datei nicht lesen und verarbeiten. Ich habe das mediainfo
Tool verwendet, um die beiden Dateien zu vergleichen, und habe Unterschiede in den Headergrößen festgestellt, während alle Video-Codec-bezogenen Inhalte gleich waren. Ich habe festgestellt, dass die HEADER-GRÖSSE unterschiedlich ist, was anscheinend das Problem verursacht. Gibt es Möglichkeiten, die Headergröße (abgesehen von Codecs) gleich zu machen?
UPDATE: Hier ist die Originaldatei .mp4
, die im Emulator einwandfrei funktioniert.
.mp4
bei Bedarf freigeben.Antworten:
Verwenden von
trim
undconcat
- Quelldateien mit verschiedenen CodecsStellen Sie dazu sicher, dass Ihre einzelnen Dateien dieselbe Auflösung und im Idealfall dieselbe Framerate und Chroma-Unterabtastung usw. haben. Dies verhindert Fehler oder Störungen während der Verkettung.
Mit den Filtern
trim
und können Sie alles auf einmal erledigen, ohne die Datei zu teilenconcat
:Hier werden
trim
die einzelnen Teile der Eingangsvideostreams (0:v
,1:v
) angegeben, die Sie später verketten möchten. Diese Teile sindv0
durch benanntv2
. (Dersetpts
Filter setzt die Zeitstempel dieser einzelnen Teile auf 0 zurück, was für die Verkettung erforderlich ist.) Später verketten wir die drei Teile.Wenn Sie von einem bestimmten Zeitstempel bis zum Ende trimmen möchten, verwenden Sie,
trim=start=15
anstatt den Bereich anzugeben.Wenn Ihre Dateien Audio enthalten, müssen Sie diese Streams separat trimmen:
Beachten Sie, dass Video und Audio in diesem Fall neu codiert werden.
-crf
Stellen Sie sicher, dass Sie die entsprechenden Ausgabequalitätsziele angeben (z. B. für x264, x265 oder libvpx-vp9). Weitere Informationen hierzu finden Sie im FFmpeg-Wiki, z. B. für VP9 oder H.264 .Einzelne Segmente verwenden
Wenn Sie die Clips teilen und später wieder zusammensetzen möchten:
Wenn die Dateien Audio enthalten, verwenden Sie den gleichen Ansatz wie oben:
Dadurch wird der Videostream erneut neu codiert. Es ist etwas einfacher, sollte aber ansonsten der obigen Methode entsprechen.
Mit
concat
demuxerSie können im Prinzip auch versuchen, die Bitströme mit dem concat-Demuxer zu verketten, ohne sie neu zu codieren. Erstellen Sie eine Datei mit dem Namen
concat.txt
und fügen Sie die folgenden Einträge hinzu (entsprechend den oben erstellten Videoclips):Verketten Sie dann diese einzelnen Dateien:
Dies setzt jedoch voraus, dass Ihre Clips denselben Codec, dieselbe Auflösung, dieselbe Framerate usw. haben - daher funktioniert dies nicht mit allen Arten heterogener Quellen.
Mit
concat
ProtokollDie obige Art der Verkettung auf Dateiebene kann auch unter Verwendung des
concat
Protokolls mit den gleichen Einschränkungen wie oben (gleicher Codec, Auflösung usw.) erreicht werden:Weitere Informationen zur Verkettung finden Sie auf der entsprechenden FFmpeg-Wiki-Seite .
quelle
concat
Methode einen Fehler auslöst :[concat @ 00000000025c2560] Line 1: unknown keyword 'part1.mp4 \\ text.txt: Invalid data found when processing input
concat
Demuxer war die Syntax anders. Jetzt behoben. Gehen bis zum Ende, Verwendungtrim=start=15
finden Sie in der Trimm - Filter Dokumentation: ffmpeg.org/ffmpeg-filters.html#trim - wie für Timing - Probleme, das ist wirklich hängt von Ihrem Quellmaterial. Es gab jedoch keine Probleme beim Verketten mit dem hochgeladenen Clip.