Wyodrębnianie „jednej na 10 klatek” w wideo za pomocą VLC lub FFmpeg

12

Próbuję wyodrębnić „dokładnie 1 klatkę na każde 10” klatek filmu (tzn. Wyodrębnić 1, pozostaw 9, a następnie powtórz) do celów naukowych. Film ma 105 klatek, 3,5 sekundy, 29,97 kl./s (h.264,. Mov, wyprodukowany przez Nikona D3100).

Mam wysłał go tutaj .

VLC

Poniższe polecenie powinno wygenerować 10 klatek, ale daje tylko 6 obrazów. Próbowałem różnych proporcji scen i żadna z nich nie generowała poprawnej liczby klatek (nawet nie blisko korekty).

vlc 1.mov --video-filter=scene --vout=dummy --scene-ratio=10 --scene-prefix=img- --scene-path=. vlc://quit

Czy ktoś mógłby mi powiedzieć, na czym polega problem?

FFmpeg

FFmpeg nie wydaje się mieć komendy dokładnie dla mojego celu. Poniższe polecenie wyodrębnia 3 klatki z każdej sekundy, ale ponieważ liczba klatek na sekundę nie wynosi dokładnie 30 (raczej 2,97), nie będzie to dla mnie poprawnych wyników.

Ponadto nawet FFmpeg nie podaje prawidłowej liczby ramek nawet za pomocą tego polecenia. Na 3,5 sekundy filmu oczekuję maksymalnie 10 klatek, ale dostaję 12 klatek!

ffmpeg -i 1.mov -y -an -sameq  -r 3 -f image2 -vcodec mjpeg %03d.jpg 

Jak mogę osiągnąć to, czego chcę?

wmac
źródło
1
BTW -sameqnie robi tego, co prawdopodobnie myślisz, i zostało usunięte z bieżącej wersji (to znaczy prawdziwego ffmpeg, nie jestem pewien, czy jest w fałszywym ffmpeg Ubuntu). Zamiast tego użyj qscale.
stib

Odpowiedzi:

21

Wybierz 1 klatkę na każde 10 klatek

Możesz użyć selectfiltra wideo, ffmpegaby to zrobić:

ffmpeg -i input.mov -vf "select=not(mod(n\,10))" -vsync vfr -q:v 2 img_%03d.jpg
  • Dla wyjścia JPG możesz zmieniać jakość -q:v. Efektywny zakres wynosi od 2 (najlepsza jakość) do 31 (najgorsza jakość). Nie potrzebujesz tej opcji, jeśli chcesz zamiast tego wyświetlać dane w formacie PNG.

  • Wyjście to wola img_001.jpg, img_002.jpg, img_003.jpg, itd.

Llogan
źródło
Wygląda bardzo interesująco, ale wydaje się, że wymaga określonej wersji lub dodatkowej kompilacji. Dostaję „ unrecognized option '-filter:v'” z „wersją FFmpeg SVN-r0.5.1-4: 0.5.1-1ubuntu1.3” (--enable-avfilter --enable-avfilter-lavf --enable-vdpau --enable-bzlib --enable -libgsm --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-pthreads --enable-zlib - disable-stripping --disable-vhook --enable-runtime-cpudetect - -enable-gpl --enable-postproc --enable-swscale --enable-x11grab --enable-libdc1394 --enable-shared --disable-static)
mivk
Nie mogę również uruchomić polecenia i wyświetlić następujący błąd w oknach ffmpeg N-35709-g7d531e8: [select @ 017EBB00] [Eval @ 0022DC08] Missing ')' lub zbyt wiele argumentów w 'mod (n \, 10))' [ wybierz @ 017EBB00] Błąd podczas analizowania wyrażenia „nie (mod (n \, 10))„ Błąd inicjowania filtra „wybierz” z argumentami nie (mod (n \, 10)) „Błąd otwierania filtrów!
wmac
@mivk Twoja wersja FFmpeg z repozytorium Ubuntu nie ma możliwości filtrowania. Będziesz musiał skompilować FFmpeg .
llogan
1
@wmac Myślę, że Windows nie lubi pojedynczych cytatów. Zmienić ich cudzysłowach: ".
llogan
1
@ LordNeckbeard, dzięki, działa poprawnie i rozwiązał cały problem. Naprawdę doceniam twoją pomoc.
wmac
4

Najważniejszym aspektem twojego pytania jest fakt, że wideo wykorzystuje 29,97 klatek na sekundę, a nie 30. Pesky NTSC.

W każdym razie myślę, że najłatwiej byłoby po prostu wyodrębnić każdą ramkę , a następnie usunąć te, których nie potrzebujesz:

ffmpeg -i 1.mov -y -f image2 -c:v mjpeg %03d.jpg

Następnie usuń te, których nie potrzebujesz. Ponieważ co dziesiąta klatka kończy się na 1.jpg, możemy po prostu zabrać wszystkie pozostałe…

find . -maxdepth 1 -not -iname "*1.jpg"

… A kiedy masz pewność, że są to te, które chcesz usunąć:

find . -maxdepth 1 -not -iname "*1.jpg" -exec rm '{}' \;

Jeśli możesz użyć mencoder, możesz wypróbować tę framestepopcję, jak wyjaśniono w dokumentacji , tak jak framestep=10w twoim przypadku. Osobiście nie mogłem zainstalować / wypróbować.

slhck
źródło
1
Bardzo dziękuję za pomoc i edycję. Próbowałem mencodera i nawet ten ma problem! Chyba ma to coś wspólnego z kodekiem lub kontenerem. ffmpeg wyodrębnia dokładnie 105 klatek za pomocą poniższego polecenia: ffmpeg -i 1.mov -y -an -sameq -f image2 -vcodec mjpeg% 03d.jpg, ale mencoder wyodrębnia tylko 90 klatek !!! z poniższym poleceniem: mplayer -vo png 1.mov Użycie framestep = 10 powoduje również wygenerowanie niewłaściwej liczby ramek. Jestem zszokowany tym, że wszystkie trzy (ffmpeg, vlc i mencoder) nie są w stanie poprawnie wykonać tak prostego zadania. Przesłałem raport o błędzie na stronę VLC. Dzięki jeszcze raz.
wmac
0

Jeśli miałbyś najpierw przekonwertować wideo na serię nieprzetworzonych obrazów rgb24 lub rgb32, być może będziesz w stanie uzyskać odpowiednią liczbę klatek, ponieważ w oryginalnej formie wydaje się, że zawierają niezwykłe typy klatek, które mogą wcale nie być obrazami? ?

Na oryginalnych dyskach laserowych cały film składał się z serii obrazów z indywidualnymi numerami klatek od 1 do 100 000 lub więcej, i tak naprawdę jest to właściwy sposób na ustanowienie linii bazowej dla przyszłych konwersji lub manipulacji.

Przemysł zmienił się na ten dziwny pomysł na kompresję po prostu w celu zmniejszenia wypłaconych pieniędzy i zepsucia prawdziwych naukowych form postępowania z liczbami.

Najpierw musisz wyodrębnić dowolny plik audio jako plik fali, aby nie stracić go całkowicie. Wygląda na to, że FFMPEG umieszcza informacje identyfikujące w każdym wyodrębnionym obrazie, ponieważ jeśli spróbujesz połączyć obrazy razem z dopiero co wyodrębnionymi i miksujesz inne obrazy z innych źródeł o tym samym rozszerzeniu, ffmpeg zignoruje obrazy, które próbujesz ułożyć na środku wszystkiego .

W przypadku formatu dysku laserowego częstotliwość klatek jest po prostu podyktowana dowolną częstotliwością wyświetlania kolejnych zdjęć i nie jest w żaden sposób kontrolowana przez same obrazy.

FFMPEG może czerpać naukę z nauki zamiast sztuki, aby prawidłowo obsługiwać i wyświetlać obrazy dowolnego rodzaju. A może cała branża AV. Przemysł naprawdę musi poprawić możliwości sprzętu i korzystać z surowych danych, które wymagają dużej ilości pamięci / pamięci. Nic nie przebije surowych danych pod względem precyzji i dokładności.

Aluetta
źródło