FFMPEG Video mix

Der YouTube Kanal war hauptsächlich für die Promotion der poptravel Website gedacht. Bisher habe ich 150 Videos ohne irgendwelches Marketing hochgeladen. Damit ich aber die 4K60 Filme irgendwie mit einem Intro versehen kann, muss ich mir was fixes einfallen lassen.

Der Plan ist, dass ich ein paar Sekunden am Start des Videos rausschneide, mit einem Alpha Video Overlay versehe und die Sache wieder zusammenfüge und dann den Rest vor dem Upload in das MOV merge.

Per AE baute ich eine schnelle Animation, dann auch mit Musik und gab das auf RGBA aus. Ein richtiges Intro muss auch her.

Per FFMPEG dann ging die Sache weniger schnell, doch ich fand die richtigen Optionen für die Kombi Intro + start zu einem neuen MOV.


ffmpeg -i intro.mov -i start.mov -filter_complex \
"amix=inputs=2, afade=d=2.0;\
[1][0]overlay=1:0[out]" \
-shortest -map [out] -acodec aac -b:a 260k -b:v 37500k -pix_fmt yuv420p -vcodec libx264 -f mov \
out.mov

Am besten wäre das Splitting und merging bei ’nem Keyframe aber ich will’s mal nicht übertreiben. Am Ende sollte das alles einfach per Shell-Skript gehen. Ich will aber eben keine 5 minuten re-encoding machen und muss die richtigen Einstellungen finden, damit QT das zusammengebaute Video ohne skips encodet. Das kleien Tool ffprobe installierte ich mir als binary direkt in /usr/local/bin . Das gab nur die gleichen Daten aus, wie alle anderen. Am besten wäre es, gleich per Quicksync zu encoden aber da müsste ich das Ding komplett selbst compilieren.

Kurz einkaufen, der Hund macht keine Probleme.

Über ffprobe -select_streams v -skip_frame nokey -show_frames -show_entries frame=pkt_pts_time,pict_type sah ich, dass der Apple Codec alle 0,5 Sek ein keyframe setzt, während im Original alle 4.004 sec (240 frames) eins gesetzt wird – wohl wegen 59.94 fps des Osmo Pocket, gegenüber 60fps von Quicktime. Ich muss wohl den Vorspann dann auch in 59.94 fps machen und eben 1 frame weniger nehmen, damit ffmpeg alles schön zusammensetzt? Nach dem Sync vom Zoom Audio kämen diese Schritte hinzu:

1. Segment Nr. 1 cut 7 sec Intro (-t 7) -> start & end.mov
2. Overlay start.MP4 mit intro.mov (RGBA siehe oben)
3. Archivierung start.MP4 (ohne Overlay) für eventuelle Rekonstruktion später
4. Merge von out.mov mit end.mov ?
5. QuickTime encoding aller Teile (eventuell start + end statt vorherigem concat)
6. Löschen von out.mov und Segment Nr. 1 Original

Zu testen ist, ob ich die gesplitteten Videos bitgenau wieder mit FFMPEG zusammensetzen kann. Interessant ist nämlich, dass die Reihenfolge der Argumente für’s Frameseeking wichtig ist. Ich muss also ziemlich genau mein Intro zum Keyframe stoppen, damit es nicht mal schwarz wird.

Bei ffmpeg -ss 0 -i DJI_0259.MP4 -t 0:0:8.01 -acodec copy -vcodec copy start.MP4 bekomme ich noch das keyframe 8.008 – bei nur -t 8 nicht (480 vs 479 frames).

Ich muss also die Keyframes alle 4.004 sec beachten und kann mit t 4, 8 oder 12 was anfangen. Per ffmpeg -ss 0:0:8 -i start.MP4 -t 8 -acodec copy -vcodec copy end.MP4 bekam ich direct bei Sekunde 0 ein Keyframe – bei start ab Sek 8.01 eben nicht.

Dafür gab’s dann Fehler im Audio, denn nur mit 8.01 sec wurden die Keyframes erkannt – sonst fing das End bei Sek 4 an.

ffmpeg -ss 00:00:00 -i DJI_0259.MP4 -to 00:00:08 -acodec copy -vcodec copy start.MP4
ffmpeg -ss 00:00:08.01 -i DJI_0259.MP4 -acodec copy -vcodec copy end.MP4
ffmpeg -f concat -safe 0 -i mylist.txt -copytb 1 -c copy output.mp4

Weiterhin eine fehlermeldung „Non-monotonous DTS in output stream 0:1;“. Ganz so einfach ist’s doch nicht.

Ich vereinfachte die Sache und nahm das Input Seeking weg:
#! /bin/bash
ffmpeg -i DJI_0259.MP4 -t 8 -c copy start.MP4
ffmpeg -i DJI_0259.MP4 -ss 00:00:08 -c copy end.MP4
ffmpeg -f concat -safe 0 -i mylist.txt -c copy output.mp4

Das ging, doch ich merkte, dass im neuen Output der Audiotrack 1 Frame zurückhängt. Auch hier wurde ich fündig, da die timebase bei concat nicht berücksichtigt wird. Da ich aber die gleichen timebases habe, denke ich mal, musste ein hack her:
ffmpeg -i DJI_0259.MP4 -t 00:00:08.01 -c copy start.MP4
ffmpeg -i DJI_0259.MP4 -ss 00:00:08 -c copy end.MP4
ffmpeg -f concat -safe 0 -i mylist.txt -c copy output.mp4

Es wird einfach eine 1/100 Sekunde mehr genommen, damit wohl das nächste Keyframe erreicht (8.008s) – so passte es. Audio sollte andere Keyframes haben aber naja. Jetzt muss ich sehen, wie dann ein Intro davor vom AE Export die Sache verändert. Es wäre aber eben schon gut, nur 8 Sekunden zu rendern als die 5m27s, was dem 4GB File entspricht. Das Merging kann über Quicktime gehen. Eventuell ist autoconvert mal hilfreich: ffmpeg -auto_convert 1 -f concat -i mylist.txt -c copy out.mp4

Das alles hätte ich gern noch heute beendet. Der Hund heulte nur zu laut und traurig. Zeit für die Heija um Mitternacht. Kleiner Fortschritt heute.

0 Responses to “FFMPEG Video mix”


Kommentare sind zur Zeit nicht möglich.
2019-07-17_12-10-51_IMG_20190717_121051.jpg
2019-07-17_12-10-51_IMG_20190717_121051.jpg
2019-07-17_13-31-41_P1770210.jpg
2019-07-17_13-31-41_P1770210.jpg
2019-07-17_13-33-41_P1770211.jpg
2019-07-17_13-33-41_P1770211.jpg
2019-07-17_17-08-26_IMG_20190717_170826.jpg
2019-07-17_17-08-26_IMG_20190717_170826.jpg
2019-07-17_19-53-27_IMG_20190717_195327.jpg
2019-07-17_19-53-27_IMG_20190717_195327.jpg
2019-07-17_19-59-08_IMG_20190717_195908.jpg
2019-07-17_19-59-08_IMG_20190717_195908.jpg
2019-07-17_23-43-06_IMG_20190717_234306.jpg
2019-07-17_23-43-06_IMG_20190717_234306.jpg
2019-07-17_23-48-09_IMG_20190717_234809.jpg
2019-07-17_23-48-09_IMG_20190717_234809.jpg