Wie lassen sich Videoclips mit kurzen Übergängen effizient und automatisch zusammenfügen?

2196
bertieb

Ich versuche, eine Reihe von Videoclips (mit Audio) unter Verwendung einiger kurzer Übergänge (idealerweise Crossfade) auf einfache, automatisierte und effiziente Weise zu verbinden.

IE:

ClipA ---> ClipB --> ClipC --> ClipD [aaaaaaaa][bbbbbbbb][cccccccc][dddddddd] (--> indicate crossfades, not to scale!) 

Zu klären:

  • im direkten Sinn wäre es im Idealfall die Verwendung von "Standard" -Tools (dh solche, die ich bereits kenne ffmpeg, aber weniger bekannte Tools wie meltdefinitiv qualifizieren, und ich bin bereit, neue Horizonte wie MoviePy zu erkunden).
  • Mit automatisiert meine ich etwas, das parametriert und in ein python/ shell/ etc-Skript eingefügt werden kann
  • Mit effizient meine ich schnell kodierendes oder minimierendes Umcodieren

Im Moment verwende pythonund verwende ich ffmpegeine Videodatei, die bereits in Matroska / h264 / aac verwendet wurde, unter Verwendung des Stream-Copy-Parameters ( sehr schnell ), der auf Timecodes in einer Textdatei basiert. Anschließend meltwerden diese Clips nacheinander mit kurzen Luma-Übergängen (Crossfade-Übergängen) hintereinander bespannt ( sehr langsam, da die gesamte Sequenz neu codiert wird ).

Es scheint mir, dass aus diesen langen Videoclips nur ein paar Sekunden verarbeitet und neu codiert werden müssen - die Übergänge selbst. Der Rest kann kopiert werden. Gibt es einen bereits vorhandenen / intuitiven Weg, dies zu tun? Mein naiver Ansatz wäre, die Clips weiter in Subclips zu zerhacken melt, die Übergänge zu erstellen und den concatFilter zu verwenden, um die Verwirrung zusammenzufügen.

Z.B:

ClipA1 ClipA2 ClipB1 ClipB2 ClipB3 ClipC1 ClipC2 ClipC3 ClipD1 Clip D2 [aaaaaaa] + [a][b] + [bbbbbb] + [b][c] + [cccccc] + [c][d] + [ddddddd] (+ indicates concat-ing of subclips; [x][y] indicates a short xfade from x to y) 

Allerdings bin ich auf laden aus zurückhaltender, was Narren Auftrag kann sein, wie ich antizipieren melt/ ffmpeg-related gotchas um Timing von Schnitten und Audio - Synchronisation; Ich möchte keine Video- oder Audiodateien aufgrund der Platzierung von I-Frames oder was Ihnen fehlt. Außerdem habe ich das Gefühl, dass ich nicht die erste Person bin, die auf dieses Thema stößt. Daher bin ich neugierig, wie klüger es ist, als ich es gelöst habe - meine Lösungen tendieren zu den Naiven, wie ich sage!

Hoffe das war klar. Cheers für das Lesen und vielen Dank im Voraus!


Für den Kontext ist es mein Ziel, nicht geschnittenes, live geschnittenes Videospielmaterial in ein interessantes / "nützliches" Video zu integrieren. Das heißt, die langweiligen Flusen des Ladens von Sachen, das Sortieren von Konnektivitätsproblemen usw. werden abgeschnitten. Aber es ist auch möglich, hervorzuheben, eine Montage, um den Fortschritt zu zeigen. Da es theoretisch jedes Mal auftaucht, wenn neues Filmmaterial vorhanden ist, habe ich großes Interesse daran, es auf die effizienteste (proaktivste und faulste) Weise zu machen.

1
Ich denke, [this] (http://stackoverflow.com/questions/30395469/ffmpeg-audio-crossfade) ist das, wonach Sie suchen. Aber es verarbeitet immer noch das ganze Video. Chamath vor 8 Jahren 0
@Chamath danke dafür - ja, es wird eine Neucodierung vorgenommen, kann aber tatsächlich Teil der Lösung sein; Siehe eine verwandte Frage, die ich gestellt habe: http://superuser.com/questions/931969/creating-videos-for-ffmpegs-concat-demuxer-to-avoid-a-large-re-encode bertieb vor 8 Jahren 0

1 Antwort auf die Frage

2
Zulko

Ich hatte keine Zeit, es zu testen, aber dies sollte funktionieren, wenn Sie MoviePy verwenden möchten:

from moviepy.editor import *  clips = [ VideoFileClip("vid1.mp4"), VideoFileClip("vid2.mp4"), VideoFileClip("vid3.mp4"), ... ]   fade_duration = 1 # 1-second fade-in for each clip clips = [clip.crossfadein(fade_duration) for clip in clips]  final_clip = concatenate_videoclips(clips, padding = -fade_duration)  # You can write any format, in any quality. final_clip.write_videofile("final.mp4", bitrate="5000k") 
Da ich MoviePy nicht kenne, ist dies sehr nützlich - vielen Dank! Leider erfolgt jedoch eine Transkodierung über die gesamte Videodauer hinweg. Beim Versuch mit 2 Clips wird eine voraussichtliche Codierungsdauer von ~ 2 Stunden angegeben. Ist das unvermeidbar oder habe ich Ihren Beispielcode nicht korrekt verwendet? bertieb vor 8 Jahren 0