FFMpeg-Sound geht verloren, wenn das kurze Overlay-Video endet

341
Daryl

Ich erstelle eine Videodatei, die 36 Sekunden lang ist. Es besteht aus drei .mp4-Dateien. Eine Videodatei ist der Hintergrund und die beiden anderen Videos sind Überlagerungen. Eines der Overlay-Videos endet etwa 26 Sekunden vor dem Video.

Problem: Wenn das Overlay nach 26 Sekunden im Video endet, bleibt das Overlay-Video auf dem Bildschirm angehalten und der Ton für die anderen beiden Videos geht verloren . Es gibt 10 Sekunden tote Luft.

Es wäre vorzuziehen, wenn das Video für die Überlagerung am Ende entfernt wurde. Das Wichtigste ist jedoch, dass das Ende der Audiodaten für die anderen beiden Videos nicht zu stoppen ist.

ffmpeg -loglevel fatal \ -itsoffset 0.401 -i 4609_segment_1_remote_0.mp4 \ -itsoffset 0.304 -i 4609_segment_1_remote_1.mp4 \ -i 4609_segment_1_local_0.mp4 \ -filter_complex " \ [1:v]scale=iw/4:-1:flags=lanczos[rem1]; \ [2:v]scale=iw/4:-1:flags=lanczos[loc0]; \ [0:v]transpose=1[rotate1]; \ [rotate1][loc0]overlay=main_w-overlay_w-10:main_h-overlay_h-10[rem0]; \ [rem0][rem1]overlay=main_w-overlay_w-180:main_h-overlay_h-10[rem1]; \ [0:a][1:a][2:a]amerge=inputs=3[a]" \ -map "[rem1]" -map "[a]" -ac 3 -vcodec libx264 \ -ar 44100 -strict -2 -acodec aac 4609_segment_1.mp4 

Eingabedatei [0]: 4609_segment_1_remote_0.mp4
Alias: [0: v], [rem0], drehen1]
Dauer: 00: 00: 35.58
Abmessungen: 640x480 [SAR 1: 1 DAR 4: 3]
Starts: 0,401 Sekunden
Video wird gedreht 90 Grad
Hintergrundvideo im Uhrzeigersinn

Eingabedatei [1]: 4609_segment_1_remote_1.mp4
Alias: [1: v], [rem1]
Dauer: 00: 00: 25.14
Dimensionen: 640x480 [SAR 1: 1 DAR 4: 3]
Starts: 0.304 Sekunden
Überlagerung: 180 px von rechts 10 px von unten

Eingabedatei [2]: 4609_segment_1_local_0.mp4
Alias: [2: v], [loc0]
Dauer: 00: 00: 34.98
Dimensionen: 640x480 [SAR 1: 1 DAR 4: 3]
Starts: Sofort
Überlagerung: 10 px von rechts, 10 px von unten

Das Ergebnis ist ein Video mit 480x640. Video dauert 36 Sekunden. Audio dauert 26 Sekunden. In der rechten unteren Ecke des Videos befinden sich zwei überlagerte Videos.

0
"-strict -2" wird nicht mehr benötigt. (Wurde früher für `aac` als Audio-Codec benötigt, gilt aber jetzt als stabil.) slhck vor 6 Jahren 2

1 Antwort auf die Frage

1
Gyan

Benutzen

ffmpeg -loglevel fatal \ -itsoffset 0.401 -i 4609_segment_1_remote_0.mp4 \ -itsoffset 0.304 -i 4609_segment_1_remote_1.mp4 \ -i 4609_segment_1_local_0.mp4 \ -filter_complex " \ [1:v]scale=iw/4:-1:flags=lanczos[rem1]; \ [2:v]scale=iw/4:-1:flags=lanczos[loc0]; \ [0:v]transpose=1[rotate1]; \ [rotate1][loc0]overlay=main_w-overlay_w-10:main_h-overlay_h-10[rem0]; \ [rem0][rem1]overlay=main_w-overlay_w-180:main_h-overlay_h-10:eof_action=pass[rem1]; \ [1:a]apad[1a];[2:a]apad[2a]; \ [0:a][1a][2a]amerge=inputs=3[a]" \ -map "[rem1]" -map "[a]" -ac 3 -vcodec libx264 \ -ar 44100 -strict -2 -acodec aac 4609_segment_1.mp4 

amerge endet mit der kürzesten Eingabe, die Abhilfe besteht also darin, alle Eingänge auf unbestimmte Zeit zu erweitern, außer einer, die die Audio-Ausgangslänge bestimmt.

eof_action=pass löscht die Überlagerung, sobald der sekundäre Stream endet.

Das hat perfekt funktioniert. Vielen Dank! Daryl vor 6 Jahren 0