Diese Antwort verbessert auf @slhck ‚s Antwort, die in einigen Situationen kann nicht funktionieren.
Bei der Auswahl von Frames nach (ungefährem) Zeitstempel kann es vorkommen, dass der tatsächliche Zeitstempel des Frames nicht exakt mit dem gewünschten Zeitstempel übereinstimmt. In einem Video mit einer Bildrate von 23,98 (24000/1001) gibt es beispielsweise keinen Frame mit Zeitstempel 1.0 - der nächste Frame hat einen Zeitstempelwert von 1.001.
Der Ausdruck wird eq(t, specific_timepoint)
nur dann t
als wahr ausgewertet, wenn er genau gleich ist specific_timepoint
. Daher kann in der oben beschriebenen Situation kein Rahmen ausgewählt werden. Als Workaround können wir den ersten Frame unmittelbar nach dem gewünschten Zeitstempel auswählen, dh den Frame, dessen Timestamp-Wert größer oder gleich dem angegebenen Zeitpunkt ist, während der Zeitstempel des vorhergehenden Frames niedriger als der angegebene Zeitpunkt war. Der Auswahlausdruck für einen einzelnen Zeitpunkt lautet
lt(prev_pts * TB,
timepoint
) * gte(pts * TB,
timepoint
)
Beachten Sie, dass ich bewusst keine kürzere Variante verwendet habe
between(
timepoint
, prev_pts*TB, pts*TB)
das ist äquivalent zu
lte(prev_pts * TB,
timepoint
) * gte(pts * TB,
timepoint
)
B. zwei aufeinanderfolgende Frames auswählen, wenn der Zeitstempelwert von (dem ersten) einen genau mit dem angegebenen Zeitpunktwert übereinstimmt.
Beispiel: Auswählen der Bilder, die den Zeitpunkten 1.5, 10 und 20 entsprechen oder unmittelbar darauf folgen:
ffmpeg -i input.mp4 -filter:v \ "select='lt(prev_pts*TB\,1.5)*gte(pts*TB\,1.5) \ +lt(prev_pts*TB\,10)*gte(pts*TB\,10) \ +lt(prev_pts*TB\,20)*gte(pts*TB\,20)'" \ -vsync drop images-filename_%03d.png