2016-02-27 11 views
8

Na podstawie tego artykułu wydaje się, że możliwe jest użycie FFMPEG wykryć zmianę sceny w filmach: http://www.luckydinosaur.com/u/ffmpeg-scene-change-detectorKorzystanie z FFMPEG: Jak wykonać wykrywanie zmiany sceny? z kodem czasowym?

teraz mam film, który wyświetla tekst książka i gdy tekst (słowo lub zdanie) wypowiedziała go zostanie podświetlony. Coś w tym audio książki: https://youtu.be/lA7L6ZNVKjc

Muszę wiedzieć, znacznik czasu, gdy tekst zostanie podświetlony (stąd zmianę sceny), to pozwala mi dodawać tagi datownika na moim YouTube wideo, dzięki czemu staje się łatwiejsze dla słuchaczy do nawigacji przez audiobook.

Co to jest linia poleceń magic, która to zrobi?

Dziękuję bardzo!

Odpowiedz

8

Łą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.

+0

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

+1

@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

4

Nie mam przedstawiciela, aby opublikować komentarz na temat powyższej odpowiedzi, ale chciałem zwrócić uwagę, że grep zamieszczony zarówno przez @ckoehn, jak i @keypulsation spowoduje pobranie tylko znaczników czasu będących zmiennoprzecinkowymi. Chwycić zarówno zmiennoprzecinkowe znaczniki czasu i całkowite użyciu poniższe wyrażenie

grep showinfo ffout | grep pts_time:[0-9.]* -o | grep -E '[0-9]+(?:\.[0-9]*)?' -o > timestamps 
Powiązane problemy