Wybieranie jednej n klatek z wideo za pomocą ffmpeg

4

Próbowałem wyodrębnić jedną N klatek z wideo za pomocą ffmpeg. Próbowałem użyć tego polecenia: ffmpeg -i input.mp4 -vf "select=not(mod(n\,10))" 1_every_10/img_%03d.jpg

Chciałem sprawdzić, czy działa zgodnie z oczekiwaniami. Więc wyodrębniłem wszystkie ramki, używając: ffmpeg -i input.mp4 -vf "select = not (mod (n \, 1))" all / img_% 03d.jpg

A potem próbowałem sprawdzić, czy drugi obraz z pierwszego polecenia odpowiada obrazowi nr 20 z drugiego polecenia i nie pasuje. Potwierdzono zarówno wizualnie, jak i za pomocą polecenia diff podobnego

diff all/img_020.jpg 1_every_10/img_002.jpg Binary files all/img_020.jpg and 1_every_10/img_002.jpg differ

Czy ktoś wie, co się dzieje? Dzięki!

Pradheep Elango
źródło

Odpowiedzi:

3

Domyślnie multiplekser obrazu2 ma stałą częstotliwość klatek. Więc jeśli wejście wynosi, powiedzmy, 30 klatek na sekundę i wybierzesz co 10 klatkę, tj. Klatki ze znacznikiem czasowym 0s, 0,33s, 0,66s ... to ffmpeg powieli klatki, aby dopasować szybkość wejściową, więc powiel 9 klatek dla każdej klatki wejściowej.

Sposobem na uniknięcie tego jest ustawienie metody synchronizacji wideo na przepustowość lub zmienną liczbę klatek na sekundę

na przykład

ffmpeg -i input.mp4 -vf "select=not(mod(n\,10))" -vsync vfr 1_every_10/img_%03d.jpg

Może to potencjalnie wpłynąć na pełną ekstrakcję, jeśli wejściem jest VFR. Więc użyj

ffmpeg -i input.mp4 -vf select -vsync vfr all/img_%03d.jpg
Gyan
źródło
Dzięki @mulvya za edukację. Próbowałem wyżej, ale nadal widzę podobny problem. Widzę to 1_every_10/img_001.jpgi all/img_001.jpgpasuję, ale potem nic więcej w 1_every_10meczach.
Pradheep Elango,
for f in all/*.jpg; do diff $f 1_every_10/img_002.jpg; done | wc -ldaje 136. for f in all/*.jpg; do diff $f 1_every_10/img_001.jpg; done | wc -ldaje 135. for f in all/*.jpg; do diff $f 1_every_10/img_003.jpg; done | wc -l<br/> daje 136.
Pradheep Elango
To nie jest niezawodna metoda sprawdzania. Jeśli sprawdzisz go wzrokiem, przekonasz się, że działa. ffmpeg to przede wszystkim aplikacja wideo, więc wszystkie kodery mają w użyciu pewną metodę kontroli szybkości, niejawną lub jawną. W przypadku sekwencji JPEG koderem jest MJPEG, a domyślna przepływność wynosi 200 kb / s, więc przy podawaniu do tego kodera 30 klatek na sekundę czasu trwania nośnika, w przeciwieństwie do powiedzmy 3, kwantyzacja będzie inna. Dodaj, -q:v 1aby ustawić stałą jakość i -flags +bitexactuniknąć osobliwości metadanych związanych z platformą / środowiskiem wykonawczym.
Gyan
Dziękuję bardzo @mulvya. To się udało! Masz rację, w poprzednim uruchomieniu również wizualnie dopasowane obrazy. Rzeczą, która mnie zaskoczyła, było to, nże zaczyna się od 0, a numer klatki zaczyna się od 1. Więc 1 mecze z 1, 2 mecze z 11, 3 z 21 i tak dalej ... Kiedy dodam wspomniane flagi, one dopasuj krok po kroku z diff. Odkryłem również, że właśnie -q: v 1 dało mi dokładne dopasowanie. Kiedy dodałem, -flags +bitexactrozmiar pliku był nieco mniejszy niż kiedy miałem -q:v 118 bajtów mniej. Nie wiem jednak dlaczego.
Pradheep Elango,