Jak wyodrębnić wszystkie klatki kluczowe z klipu wideo?

10

Próbuję wyodrębnić klatki kluczowe z klipu wideo. Próbowałem następujące polecenie, ale wyodrębnia wszystkie ramki.

ffmpeg -vf select="eq(pict_type\,PICT_TYPE_I)" -i 2.flv -vsync 2 -s 73x41 -r 30 -f image2 thumbnails-%%02d.jpeg
Rashed Mustafa
źródło

Odpowiedzi:

20

Możesz to uprościć, używając filtra wideo -skip_framebez potrzeby select:

ffmpeg -skip_frame nokey -i 2.flv -vsync 0 -r 30 -f image2 thumbnails-%02d.jpeg
radoh
źródło
2
Niesamowite, zajmuje mniej niż 10 sekund na 20-minutowym wideo w porównaniu do ponad 3 minut z wybranym filtrem!
szalony
Upewnij się, że używasz -threads 1, w porównaniu do domyślnego -threads autopowoduje, że cropdetectwykres filtru ( ffmpeg -threads 1 -skip_frame nokey -i input.mkv -filter:v select='not(mod(n\,20))',cropdetect -an -f null /dev/null) jest 2x szybszy w moim systemie (od 60 do 30)!
genpfault
Nie użyłbym nokey skip_frame. Czy sprawdziłeś nawet wyjście? Na moich plikach i kompilacji (sierpień 2019) dostaję niewłaściwe znaczniki czasu, ponieważ w nokey daje mi poprzednią ramkę przed I ramką, podczas gdy niefiltrowane / wszystkie ramki pokazują ramkę I w późniejszym znaczniku czasu.
JasonXA
Powodem, dla którego @genpfault sugeruje użycie, -threads 1jest to, że w przeciwnym razie sekwencja wyjściowych klatek kluczowych może zostać wydana poza kolejnością. Jeśli masz jakiś post-hoc sposób radzenia sobie z tym problemem, możesz zachować wielowątkowość. Wydaje się również, że nadal możliwe jest uzyskanie klatek kluczowych poza kolejnością, nawet przy użyciu -threads 1 , ale teraz w tym przypadku wszystkim takim zdarzeniom wydaje się towarzyszyć / oflagowany błąd dekodera h264 illegal short term buffer state detected.
Glenn Slayden
12

Przykład użycia filtrów selecti scale:

ffmpeg -i 2.flv -vf "select=eq(pict_type\,I),scale=73x41" \
-vsync vfr -qscale:v 2 thumbnails-%02d.jpeg

Kilka wskazówek:

  • Filtry nie powinny znajdować się przed -iopcją, ponieważ są opcją wyjściową. Nie wiem, skąd dokładnie otrzymałeś polecenie, ale PICT_TYPE_Inie istnieje - tak powinno być I.

  • W scalefiltrze można wymienić 73lub włączyć 41filtr automatycznie obliczający szerokość lub wysokość, aby zachować proporcje: takie jak scale=73:-1lub scale=-1:41. Zapobiega to rozciąganiu lub zgniataniu, które może wynikać z „wymuszonego” skalowania.

  • Jakość wyjściową można kontrolować za pomocą -qscale:v(lub aliasu -q:v). Efektywny zasięg to skala liniowa od 2 do 31, a niższa wartość oznacza wyższą jakość.

  • To, że ffmpegzezwala na filtr przed wejściem mówi mi, że może być nieaktualny. Pobierz najnowszą kompilację statyczną dla swojego systemu operacyjnego lub skompiluj ją samodzielnie zgodnie z przewodnikami kompilacji, jeśli powyższe nie działa.

slhck
źródło
1
Jeśli Twoim celem jest bezstratne wyodrębnianie klatek kluczowych, możesz spróbować wykonać następujące czynności:ffmpeg -i 2.flv -vf "select=eq(pict_type\,I)" -vsync vfr frame-%02d.png
Peltier
0

jeśli to błędy :

Opcji vf (ustawianie filtrów wideo) nie można zastosować do adresu URL 1508.mp4 - próbujesz zastosować opcję wprowadzania do pliku wyjściowego lub odwrotnie. Przenieś tę opcję przed plik, do którego należy. Błąd podczas analizowania opcji pliku wejściowego 1508.mp4. Błąd otwierania plików wejściowych: nieprawidłowy argument

możesz to zrobić:

ffmpeg -i 263.mp4 -vf select=eq(pict_type\,PICT_TYPE_I)  -vsync 2 -s 480x320 -r 24 -f image2 thumbnails-%05d.jpeg

== --------------------------------------------

„-I” Parametry z góry

Tomek
źródło