ffmpeg - entfernen Sie nacheinander doppelten frames
Gibt es eine Möglichkeit zum erkennen von doppelten frames in das video mit ffmpeg
.
Versuchte ich -vf
Flagge mit select=gt(scene\,0.xxx)
für die Szene zu ändern. Aber, es funktionierte nicht für meinen Fall.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden Sie die mpdecimate filter, dessen Zweck es ist, "Drop-frames, die das nicht tun, unterscheiden sich stark von den vorherigen frame um frame-rate reduzieren."
Dies erzeugt eine Konsole Auslesen-zeigt die frames, die der filter denkt, sind Duplikate.
ffmpeg -i input.mp4 -vf mpdecimate -loglevel debug -f null -
Generieren Sie ein video mit den Duplikaten entfernt
ffmpeg -i input.mp4 -vf mpdecimate,setpts=N/FRAME_RATE/TB out.mp4
Th setpts filter-Ausdruck erzeugt glatte Zeitstempel für ein video-FRAME_RATE fps. Finden Sie eine Erklärung für Zeitstempel bei Was ist video-Zeitskala, Zeitbasis oder timestamp in ffmpeg?
FRAME_RATE
werden substituded mit der frame-rate?Ich hatte auch dieses problem und Gyan ausgezeichnete Antwort oben hat mich gestartet, aber das Ergebnis war desynchronisiert audio, so hatte ich mehr zu erforschen, Optionen:
mpdecimate vs dezimieren Filter
mpdecimate
ist die standard-Empfehlung, die ich allen SO und das internet, aber ich glaube nicht, dass es sollte der erste pickfrac
parameter, aber das ist zusätzliche Arbeit, möchten Sie vielleicht zu vermeiden, wenn Sie könnenmp4
- container (Quelle), aber ich war mitmkv
so dass diese Einschränkung trifft nicht auf meinen Fall, aber gut zu wissendecimate
werden frames entfernt genau, aber es ist nur nützlich für periodisch auftretende Duplikateerkannt vs tatsächliche Bildrate
ffprobe in.mkv
ausgegeben wird erkannt FPS; es kann wie folgt AussehenStream #0:0: Video: h264 (Main), yuvj420p(pc, bt709, progressive), 1920x1080, SAR 1:1 DAR 16:9, 25 fps, 25 tbr, 1k tbn, 50 tbc (default)
ist die tatsächliche Bildrate kann gefunden werden, wenn Sie öffnen Sie den media
in.mkv
in einem media-player können Sie Schritt ein Bild von der Zeit; dann zählen Sie die Schritte, die erforderlich sind, um Voraus die Spielzeit für 1 Sekunde, in meinem Fall war es 30 fpswas ist
N/FRAME_RATE/TB
außer der Verwendung von
FRAME_RATE
variable dieN/FRAME_RATE/TB
ist gleich dem Beispiel unten von ffmpeg-Dokumentation (Quelle)die Mathematik hinter, die es perfekt erklärt Was ist video-Zeitskala, Zeitbasis oder timestamp in ffmpeg?
TB
zur Verbesserung der PräzisionFRAME_RATE
variable vs-literal FPS-Wert (z.B. 25)FRAME_RATE
variable inN/FRAME_RATE/TB
FRAME_RATE
auf Ihrem eigenenN/25/TB
FRAME_RATE
(und ich tatsächlich versucht haben), wäre es falsch erkannt fps 25 frames, d.h.FRAME_RATE=25
, führen Sie es durchmpdecimate
filter entfernen würde jedem 6. frame und es aktualisieren würde, zuFRAME_RATE=20.833
soN/FRAME_RATE/TB
wäre eigentlichN/20.833/TB
- völlig zu Unrechtzu verwenden oder nicht zu verwenden setpts
hier ist, was ich mit gute Ergebnisse
ffmpeg -i in.mkv -vf mpdecimate out.mkv
ffmpeg -i in.mkv -vf dezimieren=cycle=6,setpts=N/25/TB out.mkv
aber das folgende hat mir desynchronisiert audio
ffmpeg -i in.mkv -vf mpdecimate,setpts=N/FRAME_RATE/TB out.mkv
ffmpeg -i in.mkv -vf mpdecimate,setpts=N/25/TB out.mkv
ffmpeg -i in.mkv -vf dezimieren=cycle=6 out.mkv
wie Sie sehen
FRAME_RATE
Variablen und verwenden SieN/25/TB
statt, da die tatsächliche FPS wurde nicht richtig erkanntHinweis auf asetpts
-af asetpts=N/SAMPLE_RATE/TB
SAMPLE_RATE
nach dem Verhältnis der doppelten frames entfernt, aber es scheint mir, wie zusätzliche unnötige Arbeit, vor allem, wenn mein video hatte die audio in sync am Anfang, so ist es besser, verwenden Sie Befehle, die werden es so halten, statt Festsetzung es spätertl;dr
Wenn der Regel empfohlen, den Befehl
ffmpeg -i in.mkv -vf mpdecimate,setpts=N/FRAME_RATE/TB out.mkv
nicht für Sie arbeiten, versuchen Sie dies:ffmpeg -i in.mkv -vf mpdecimate out.mkv
oder
ffmpeg -i in.mkv -vf dezimieren=cycle=6,setpts=N/25/TB out.mkv
(
cycle=6
weil jedes 6. frame duplizieren und dieN/25/TB
weil nach dem entfernen der Duplikate wird das video 25 fps (vermeiden Sie dieFRAME_RATE
variable); stellen Sie die für Ihren Anwendungsfall)-vsync vfr
und entfernen setpts in meinem Befehl zu halten deduplizierten frames mit dem gleichen Zeitstempel beim speichern als mp4Add -vsync vfr and remove setpts in my command
@Gyan --- Gut, das ist genau das, was ich für den Anwendungsfall mitmpdecimate
, speziell ich, entfernt diesetpts
filter und ich habe nicht einmal erforderlich, die-vsync vfr
. Es ist alles intl;dr
Abschnitt.The setpts is needed with mp4 because it is a constant frame rate muxer
@Gyan --- das ist interessant, aber beachten Sie auch, dass, während ich war in der Lage zu entfernensetpts
filter aus dermpdecimate
filter Anwendungsfall (wie Sie vorschlagen), I musste verwendensetpts
für diedecimate
Anwendungsfall. Beide sindmkv
. Gehen Abbildung, richtig?!