Łącząc filtr scene (do wykrywania zmian sceny) i filtr showinfo powinna osiągnąć co chcesz:
ffmpeg -i input.flv -filter:v "select='gt(scene,0.4)',showinfo" -f null - 2> ffout
ekstrakty
To polecenie Wszystkie ramy, które różnią się od poprzedniej ramki o więcej niż (gt
) 0.4
(w skali od 0
do 1
). Dla tych ramek, informacje są drukowane (showinfo
) jak to
[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]
Teraz trzeba tylko wydobyć znacznik czasu. Myślę, że interesuje Cię pts_time
. Można to zrobić tak:
grep showinfo ffout | grep pts_time:[0-9.]* -o | grep [0-9.]* -o > timestamps
To daje listę wszystkich znaczników czasu:
2.5372
4.37799
6.65301
8.09344
Na takie podejście do pracy, trzeba mieć wersję FFmpeg, który implementuje wykrywanie sceny. Musisz również wybrać odpowiednią wartość progu (0.4
w pierwszym poleceniu). Można spróbować znaleźć optymalny próg przez wyodrębnianie klatek dla różnych progów (a potem zbadać ramy ręcznie) jak to
ffmpeg -i input.flv -filter:v "select='gt(scene,0.1)',showinfo" -vsync 0 frames/%05d.jpg
tylko dla wyjaśnienia: grep [0-9.]*
nie wyklucza całkowite według innej odpowiedzi. Dopasowuje dowolną sekwencję znaków składającą się z cyfr i kropek, ale pasuje również do liczb innych niż "4.4.4". Jednak ffmpeg nie powinien wypuszczać takich źle sformułowanych znaczników czasu.
ostatni grep powyżej powinny być grep [0-9] * \. [0-9] * '-o' tak, że końcowe grep to 'grep showinfo ffout | grep pts_time: [0-9.] * -o | grep '[0-9] * \. [0-9] *' -o> znaczniki czasu ' '.' musi być uniknięty, w przeciwnym wypadku pasuje do dowolnego znaku – keypulsations
@keypulsations,' [.] 'nie pasuje dowolny znak '.' robi. '[.]' jest wyrażeniem nawiasowym, które dopasowuje dowolny pojedynczy znak między nawiasami.Zobacz także [podręcznik grep na "Klasy znaków i wyrazy bracketingu"] (https://www.gnu.org/software/grep/manual/html_node/Character-Classes-and-Bracket-Expressions.html#Character-Classes- i-Bracket-Expressions). Podczas gdy 'grep [0-9.] *' Również będzie pasował więcej niż liczby zmiennoprzecinkowe i liczby całkowite (ale w rzeczywistości nie jest to w tym potoku), twoje wyrażenie regularne może wykluczać liczby całkowite wskazane w drugiej odpowiedzi. – ckoehn