Mam mały plik wideo, który ffprobe opisuje jako: -
Input #0, avi, from 'sample.avi':
Metadata:
encoder : Lavf55.12.100
Duration: 00:00:35.00, start: 0.000000, bitrate: 546 kb/s
Stream #0:0: Video: msmpeg4v3 (MP43 / 0x3334504D), yuv420p, 320x240,
506 kb/s, 200 fps, 200 tbr, 200 tbn, 200 tbc
Ponieważ wideo trwa 35 sekund. długi i przy częstotliwości odświeżania 200 kl./s, spodziewam się, że w filmie będzie (35 x 200) = 7000 klatek.
Jeśli użyję ffmpeg do faktycznego wyodrębnienia obrazów klatki z wideo, faktycznie otrzymam 6999 obrazów (chyba wystarczająco blisko). Polecenie, którego tu używam, to: -
c:\> ffmpeg -i sample.avi -f image2 -c:v png Img%%04d.png
Uwaga: „%%” jest wymagany, gdy polecenie jest uruchamiane z interfejsu CLI WinXP
Jednak za pomocą polecenia: -
c:\> ffprobe -select_streams v -show_frames sample.avi > frames.lis
i zliczając liczbę elementów [FRAME] w ramkach. ris daje liczbę ramek 1023, a nie 7000.
Jakieś wyjaśnienie?
Oto link do bardzo podobnego pliku, który zachowuje się w ten sam sposób (~ 7 MB):
http://www.filedropper.com/sample_65
Kliknij lewym przyciskiem myszy obraz „Pobierz ten plik” na stronie.
Używam 17APR2014 statycznej wersji Win32 ffmpeg 'ffprobe' pod WinXP-SP3.
Jeśli jest inny sposób, staram się przede wszystkim zbudować tabelę „numer klatki” w porównaniu z „czasem” dla serii plików wideo do użycia w innej aplikacji.
Dzięki.
Odpowiedzi:
Czy istnieje przyczyna 1023, która nie może być poprawna? Fps, o którym mówisz, to informacje w nagłówku, więc może łatwo być niepoprawny.
Czy na wyjściu png jest dużo zduplikowanych ramek? Ffmpeg może wyświadczyć ci przysługę i wyświetlać skopiowane klatki, aby pasowały do zgłaszanego fps i czasu trwania.
Używanie ffprobe jest moim zalecanym rozwiązaniem. Trudno być pewnym w 100% przypadków, chyba że faktycznie dekodujesz klatki i liczysz. Tak więc użycie -count_frames lub -show_frames powinno dać ci numer, którego szukasz.
Uwaga: Nie ma gwarancji, że podany czas trwania jest dokładny.
źródło