Die Kombination der scene Filter (für Szenenwechsel Erkennung) und der showinfo Filter sollte erreichen, was Sie wollen:
ffmpeg -i input.flv -filter:v "select='gt(scene,0.4)',showinfo" -f null - 2> ffout
Dieser Befehl extrahiert alle Frames, die von aus dem vorhergehenden Rahmen unterscheiden sich mehr als (gt
) 0.4
(auf einer Skala von 0
bis 1
). Für diese Rahmen werden Informationen ausgedruckt (showinfo
) wie dieses
[Parsed_showinfo_1 @ 0x2d85e60] n: 0 pts:2537204 pts_time:2.5372 pos: 2998114 fmt:rgb24 sar:1/1 s:1920x1200 i:P iskey:1 type:I checksum:5616582E plane_checksum:[5616582E]
Jetzt müssen Sie nur den Zeitstempel extrahieren. Ich glaube, Sie interessieren sich für pts_time
. Man könnte es wie folgt tun:
grep showinfo ffout | grep pts_time:[0-9.]* -o | grep [0-9.]* -o > timestamps
Dies wird Ihnen die Liste aller Zeitstempel:
2.5372
4.37799
6.65301
8.09344
für diesen Ansatz zu arbeiten, müssen Sie eine Version von FFmpeg haben, die die Szenenerkennung implementiert. Außerdem müssen Sie einen geeigneten Wert für den Schwellenwert auswählen (0.4
im ersten Befehl). Sie können versuchen, einen optimalen Schwellenwert zu finden, indem Rahmen für unterschiedliche Schwellenwerte Extrahieren (und danach die Rahmen manuell prüfen) wie diese zur Klärung
ffmpeg -i input.flv -filter:v "select='gt(scene,0.1)',showinfo" -vsync 0 frames/%05d.jpg
Nur: grep [0-9.]*
keine ganzen Zahlen nicht ausschließen, wie in einer anderen Antwort beansprucht. Es entspricht einer beliebigen Zeichenfolge aus Ziffern und Punkten, aber es würde auch Nicht-Zahlen wie '4.4.4' entsprechen. Ffmpeg sollte jedoch solche schlecht geformten Zeitstempel nicht ausgeben.
der letzte grep oben sollte 'grep Bé [0-9] * \. [0-9] * '-o' so dass die endgültige grep ist 'grep showinfo ffout | grep pts_time: [0-9.] * -o | grep '[0-9] * \. [0-9] *' -o> Zeitstempel' das '.' muss maskiert werden, sonst entspricht es einem beliebigen Zeichen – keypulsations
@keypulsations,' [.] 'stimmt nicht überein jedes Zeichen '.' tut. '[.]' ist ein Klammerausdruck, der jedem einzelnen Zeichen zwischen den Klammern entspricht.Siehe auch [das grep-Handbuch zu "Zeichenklassen und Klammerausdrücke"] (https://www.gnu.org/software/grep/manual/html_node/Character-Classes-and-Bracket-Expressions.html#Character-Classes- und-Klammer-Ausdrücke). Während 'grep [0-9.] *' Auch mehr als Floats und Integer (aber in Wirklichkeit nicht in dieser Pipeline) entspricht, könnte Ihr Regexp ganze Zahlen ausschließen, wie in der anderen Antwort angegeben. – ckoehn