FFMPEG-Overlay-Filter teilweise Konvertierung

769
dajuric

Ich versuche, den Überlagerungsfilter auf das Video anzuwenden, um ein einzelnes Bild für einige Sekunden zu überblenden. Da meine Videodauer etwa 1 Minute beträgt, scheint es verschwenderisch zu sein, wenn FFMPEG versucht, das gesamte Video erneut zu kodieren, anstatt den Teil des Videos, der geändert werden muss, neu zu kodieren.

Mein Mischvideo-Befehl lautet:

ffmpeg -i beach.mp4 -i logo.png  -filter_complex "[0:v][1:v] overlay=25:25:enable='between(t,0,20)'"  -pix_fmt yuv420p -c:a copy output.mp4 

Weiß jemand, wie ich das vermeiden kann? (Ich habe daran gedacht, das Video zu teilen, aber es scheint, dass das Video nicht genau durch Angabe des Start- und Endbildes getrennt werden kann.)

0
Sie können das 20-Sekunden-Segment mit der Überlagerung als separate Datei kodieren und die ersten 20 Sekunden des Originals mit "-c copy" abschneiden. Verwenden Sie dann den [concat demuxer] (http://ffmpeg.org/ffmpeg-formats.html#concat), um sich ihnen anzuschließen. Beachten Sie, dass die beiden resultierenden Segmente, die verbunden werden sollen, mit den Parametern (Codec, Timebase usw.) übereinstimmen müssen. Für ein optimales Ergebnis müssen Sie einen Keyframe ausschneiden. Viel Arbeit für ein einminütiges Video. Meine Faulheit würde mir sagen, einfach alles neu zu kodieren oder einfach nicht mit dem Overlay fertig zu werden. Wenn Sie einen webbasierten Player verwenden, können Sie stattdessen das Logo hinzufügen. LordNeckbeard vor 8 Jahren 0
@LordNeckbeard Danke, aber diese Operation wird mehrmals ausgeführt, nicht nur einmal. Deshalb brauche ich Leistung. dajuric vor 8 Jahren 0
Ich nahm an, dass dies eine Möglichkeit war, aber Sie haben es in der Frage nicht erwähnt. Sie sollten die vollständige Konsolenausgabe Ihres Befehls anzeigen. LordNeckbeard vor 8 Jahren 0
@LordNeckbeard Leider nicht erwähnt. Das war die komplette Ausgabe; Ich schrieb nichts anderes, als ich beim ersten Schritt festhielt. dajuric vor 8 Jahren 0
Muss das Overlay genau 20 Sekunden dauern? Gyan vor 8 Jahren 0
Wenn das Aufteilen von Videos durch Keyframes schneller ist, kann ich dies tolerieren. Kurz gesagt, ich kann Ungenauigkeiten tolerieren. Wenn dies der Fall ist, muss ich wissen, welche Zeitstempel genau für das Zuschneiden verwendet werden. dajuric vor 8 Jahren 0

1 Antwort auf die Frage

2
Gyan

Da Sie mit einigen Ungenauigkeiten einverstanden sind, empfehle ich folgende Methode:

Segmentieren Sie den Videoeingang

ffmpeg -i beach.mp4 -c copy -segment_time 20 -f segment beach_seg%02d.mp4 

Overlay-Logo im ersten Segment

ffmpeg -i beach_seg00.mp4 -loop 1 -i logo.png  -filter_complex "[0:v][1:v] overlay=25:25:shortest=1"  -pix_fmt yuv420p -c:a copy overlay.mp4 

Concat-Segmente

Bereiten Sie zuerst eine Textdatei vor segments.txt

file 'overlay.mp4' file 'beach_seg01.mp4' file 'beach_seg02.mp4' file 'beach_seg03.mp4' ... 

Dann concat

ffmpeg -f concat -i segments.txt -c copy beach_with_logo.mp4 

Der Nachteil hierbei ist, dass die Zeitbasis von overlay.mp4 möglicherweise nicht mit der der Strandsegmente übereinstimmt. Überprüfen Sie in diesem Fall die Zeitbasis eines der Strandsegmente (das tbn) und fügen Sie -video_track_timescale <tbn>den Overlay-Befehl hinzu.

Vielen Dank (Mulvya und LordNeckbeard)! Kannst du mir einfach erklären, wenn ich ein Video in drei Teile schneide und ich das Mittelstück mit einer Software bearbeiten muss und diese Software den Frame-Offset benötigt. Wie soll ich diesen Frame-Offset erhalten? (Ich habe force_keyframes verwendet, um die Keyframes festzulegen, und dann habe ich den Schnitt gemacht - ist das in Ordnung?) dajuric vor 8 Jahren 0