Ich schreibe ein Programm, das eine sehr kurze Mediendatei in die Mitte einer längeren Mediendatei einfügen muss. Ich möchte dafür ffmpeg verwenden. Ich weiß, dass man die lange Datei in zwei Hälften teilen und dann die drei Dateien zusammenfügen kann (erste Hälfte des langen Videos > kurzes Video > zweite Hälfte des langen Videos). Ich habe versucht, dies mit dem Concat-Filter zu tun, aber das dauert extrem lange, da unser verwalteter Kubernetes-Anbieter keine Option für GPU-Ressourcen hat.
Mir wurde klar, dass der erste und der letzte Clip immer genau dasselbe Format haben werden (da sie aus derselben Quelldatei stammen), sodass ich einfach nur den mittleren, sehr kurzen Clip konvertieren konnte, um die beiden Hälften anzugleichen. Dann wären alle 3 Clips im Format und ich könnte einfach den Concat-Remuxer verwenden.
Der kurze Clip wurde ebenfalls von ffmpeg generiert, indem dasselbe Einzelbild immer wieder über einen Audioclip geschaltet wurde. Wenn meine Idee also umsetzbar ist, müsste ffmpeg nur das Audio und das einzelne sich wiederholende Bild transkodieren. Viel besser, als den gesamten langen Clip und den kurzen Clip von Grund auf neu zu transkodieren.
Wie kann ich ffmpeg dazu bringen, ein Video neu zu kodieren, damit es einem anderen entspricht?genaudamit ich sie zusammen verketten und remuxen kann?
Antwort1
Wie @Rotem in den Kommentaren angibt, können Sie die Eigenschaften des Originalvideos mithilfe ffprobe
eines geeigneten Skripts analysieren, aber das ist (wahrscheinlich) nicht ausreichend.
Einen Videostream an beliebigen Zeitstempeln richtig zu schneiden, ohne den gesamten Stream zu transkodieren, ist nicht möglich (zumindest mit ffmpeg), das geht nur an den Grenzen der Keyframes. Sie müssen also auch die Position der Keyframes analysieren und die Schnittzeitstempel entsprechend auswählen (siehe dazu dieses Thema:Wie erhält man mit FFmpeg den Zeitstempel des nächstgelegenen Keyframes vor einem gegebenen Zeitstempel?)