Czy ktoś wie, jak pobrać liczbę wszystkich klatek z pliku wideo za pomocą ffmpeg? Wyjście renderowania ffmpeg pokazuje bieżącą klatkę i potrzebuję liczby klatek, aby obliczyć postęp w procentach.
Nie wszystkie formaty (takie jak Matroska) będą zgłaszać liczbę klatek, w wyniku których zostanie wyświetlony plik N/A. Zobacz inne metody wymienione poniżej.
Dodaj -skip_frame nokeyopcję liczenia tylko klatek kluczowych.
ffmpeg: Policz liczbę klatek
Jeśli nie masz ffprobe, możesz ffmpegzamiast tego użyć :
ffmpeg -i input.mkv -map 0:v:0 -c copy -f null -
To dość szybka metoda.
Zobacz frame=bliski koniec danych wyjściowych konsoli.
Dodaj -discard nokeyopcję wejściową (przed -i), aby liczyć tylko klatki kluczowe.
Edytuj listy
Zignoruj listę edycji MP4 / M4V / M4A / MOV z -ignore_editlist 1opcją wprowadzania. Domyślnie nie lista edycji ignorowana.
Co oznaczają opcje ffprobe
-v error Powoduje to ukrycie wyjścia „info” (informacje o wersji itp.), Co ułatwia analizowanie.
-count_frames Policz liczbę ramek na strumień i zgłoś to w odpowiedniej sekcji strumienia.
-select_streams v:0 Wybierz tylko strumień wideo.
-show_entries stream=nb_frameslub -show_entries stream=nb_read_framesPokaż tylko wpis dotyczący nb_frameslub nb_read_frames.
-of default=nokey=1:noprint_wrappers=1Ustaw format wyjściowy (inaczej „piszący”) na default, nie drukuj klucza każdego pola ( nokey=1) i nie drukuj nagłówka i stopki sekcji ( noprint_wrappers=1). Istnieją krótsze alternatywy, takie jak -of csv=p=0.
Dobrze znane mediainfonarzędzie może wyświetlić liczbę ramek:
mediainfo --Output="Video;%FrameCount%" input.avi
MP4Box
Dla plików MP4 / M4V / M4A.
MP4Box z gpac może pokazać liczbę klatek:
MP4Box -info input.mp4
Zapoznaj się z Media Infolinią na wyjściu dla danego strumienia wideo:
Media Info: Language "Undetermined (und)" - Type "vide:avc1" - 2525 samples
W tym przykładzie strumień wideo ma 2525 klatek.
boxdumper
Dla plików MP4 / M4V / M4A / MOV.
boxdumperto proste narzędzie z l-smasha. Spowoduje to wyświetlenie dużej ilości informacji. W sekcji stszrozmiaru próbki patrz sample_countliczba ramek. W tym przykładzie wejście ma 1900 klatek wideo:
Lub, jeśli chcesz większej szybkości i jeśli nb_frames jest wystarczająco niezawodne, uprość to jako:ffprobe -v error -select_streams v:0 -show_entries stream=nb_frames -of default=nokey=1:noprint_wrappers=1 input.mkv
juanitogan
To daje mi odpowiedź dwukrotnie (tj. 2600 \ n 2600). Jakiś szczególny powód, który miałby się dziać?
jbodily
@jbodily Mój przykład czy juanitogan? Nie mogę tego powielić za pomocą obu. Niewiele do pracy.
llogan,
+1, między innymi dlatego, że w przeciwieństwie do zbyt wielu innych odpowiedzi na temat dowolnego narzędzia wiersza poleceń, ta w rzeczywistości wyjaśnia wszystkie opcje wiersza poleceń. Dziękuję Ci.
Ray
1
Zauważ, że pierwsza opcja, zapytanie kontenera, faktycznie przetwarza plik z powodu count_frames. Zobacz komentarz @ juanitogan.
Powinieneś być w stanie konsekwentnie i bezpiecznie znaleźć, Duration: hh:mm:ss.nnaby określić rozmiar źródłowego klipu wideo. Następnie dla każdego wiersza aktualizacji (CR, bez LF) można przeanalizować tekst pod kątem bieżącego znacznika czasu, który znajduje się w:
Przepraszam, że jestem głupi, ale jak mam określić czas / czas trwania, gdy czas trwania jest w formacie hh: mm: ss.nn, a czas jest zawsze w formacie xx.yy?
Omar Ali
2
@Omar, Jako programista .NET, tworzę TimeSpanz niego plik , a następnie go używam currentDurationTimeSpan.Ticks / (totalDurationTimeSpan.Ticks / 100). TimeSpan zapewnia również potężną funkcję Parse, sprawdź to
Shimmy Weitzhandler
doskonałe rozwiązanie, mój czas jest w hh: mm: ss: ms, więc przypuszczam, że w ciągu tych 3 lat FFMPEG poprawił format czasu wyjściowego.
ElektroStudios
1
Zauważ, że na wyjściu konsoli może pojawić się 29,97, ale to jest skrót od 30000/1001. To samo dotyczy 23,98, czyli 24000/1001, a 59,94 to 60000/1001.
llogan
Uwaga: to nie działa w przypadku filmów ze zmienną liczbą klatek na sekundę (oczywiście).
Timothy Zorn
8
Nie wszystkie formaty przechowują liczbę klatek lub całkowity czas trwania - a nawet jeśli tak, plik może być niekompletny - więc ffmpeg domyślnie nie wykrywa dokładnie żadnego z nich.
Zamiast tego spróbuj poszukać końca pliku i odczytaj godzinę, a następnie policz bieżący czas w drodze.
Alternatywnie możesz spróbować AVFormatContext->nb_index_entrieswykrytego czasu trwania, który powinien działać na dobrze przynajmniej nieuszkodzonym pliku AVI / MOV, lub bibliotece FFMS2, która prawdopodobnie jest zbyt wolna, aby zawracać sobie głowę paskiem postępu.
które dają podstawę liczbową na podstawie informacji o filmie, problem polega na tym, że gdy używasz tej metody, możliwe, że otrzymasz plik N/A wyjście as.
Powinno to być szybkie, ponieważ nie jest wykonywane żadne kodowanie. ffmpegpo prostu zdemuksuje plik i odczyta (zdekoduje) pierwszy strumień wideo tak szybko, jak to możliwe. Pierwsze greppolecenie pobierze tekst, który pokazuje ramkę. Drugie greppolecenie pobierze tylko liczbę z tego. tailKomenda będzie po prostu pokazać końcową linię (ostateczna liczba ramek).
aby oprzeć się na odpowiedzi stu. oto jak znalazłem liczbę klatek na sekundę dla filmu z mojego telefonu komórkowego. Uruchomiłem przez chwilę następujące polecenie. Pozwoliłem, aby liczba klatek wzrosła do około ~ 10 000, zanim stałem się niecierpliwy i uderzyłem ^ C:
$ ffmpeg -i 2013-07-07\ 12.00.59.mp4 -f null /dev/null 2>&1
...
Press [q] to stop, [?] for help
[null @ 0x7fcc80836000] Encoder did not produce proper pts, making some up.
frame= 7989 fps= 92 q=0.0 Lsize=N/A time=00:04:26.30 bitrate=N/A dup=10 drop=0
video:749kB audio:49828kB subtitle:0 global headers:0kB muxing overhead -100.000042%
Received signal 2: terminating.
$
następnie złapałem dwie informacje z tej linii, która zaczyna się od „frame =”, liczba ramek 7989 i czas 00: 04: 26.30. Najpierw musisz przeliczyć czas na sekundy, a następnie podzielić liczbę klatek przez sekundy, aby uzyskać „klatki na sekundę”. „liczba klatek na sekundę” to liczba klatek na sekundę.
Głosowałem za twoją odpowiedzią, ale zadziała to tylko wtedy, gdy wideo nie zawiera dźwięku. Jeśli zawiera, ten będzie działał:ffprobe -i my_video.mp4 -show_frames 2>&1 | grep -c media_type=video
Gobe,
2
Przepraszam za odpowiedź necro, ale może będzie to potrzebne (ponieważ nie znalazłem rozwiązania dla ostatnich wydań ffmpeg.
Z ffmpeg 3.3.4 znalazłem jedną z następujących rzeczy:
Na koniec wyświetli liczbę klatek. U mnie zadziałało przy filmach z dźwiękiem. Daje jednak dwukrotnie wiersz „nb_frames”, ale pierwsza linia zawierała faktyczną liczbę klatek w testowanych przeze mnie filmach.
Szybkość klatek jest zwykle obliczana na podstawie dwóch parametrów. r_frame_rate = 24000/1001 (= 23,97602397602397 ...) Zaokrąglone przez ffmpeg do: 23,98 Czas trwania = godziny * 3600 + minuty * 60 + sekund. remainder = 8177,91 Podczas gdy parametr czasu trwania = 8177,794625 Ale klatki = 24000/1001 * 8177,794625 = 196071 podaje dokładną liczbę klatek. (Bez żartów).
Odpowiedzi:
Uwaga: obecność listy edycji w MP4 / M4V / M4A / MOV może wpłynąć na numer ramki. Zobacz poniżej listy edycji .
ffprobe: Zapytaj o kontener
N/A
. Zobacz inne metody wymienione poniżej.ffprobe: Policz liczbę klatek
-skip_frame nokey
opcję liczenia tylko klatek kluczowych.ffmpeg: Policz liczbę klatek
Jeśli nie masz
ffprobe
, możeszffmpeg
zamiast tego użyć :frame=
bliski koniec danych wyjściowych konsoli.-discard nokey
opcję wejściową (przed-i
), aby liczyć tylko klatki kluczowe.Edytuj listy
Zignoruj listę edycji MP4 / M4V / M4A / MOV z
-ignore_editlist 1
opcją wprowadzania. Domyślnie nie lista edycji ignorowana.Co oznaczają opcje ffprobe
-v error
Powoduje to ukrycie wyjścia „info” (informacje o wersji itp.), Co ułatwia analizowanie.-count_frames
Policz liczbę ramek na strumień i zgłoś to w odpowiedniej sekcji strumienia.-select_streams v:0
Wybierz tylko strumień wideo.-show_entries stream=nb_frames
lub-show_entries stream=nb_read_frames
Pokaż tylko wpis dotyczącynb_frames
lubnb_read_frames
.-of default=nokey=1:noprint_wrappers=1
Ustaw format wyjściowy (inaczej „piszący”) nadefault
, nie drukuj klucza każdego pola (nokey=1
) i nie drukuj nagłówka i stopki sekcji (noprint_wrappers=1
). Istnieją krótsze alternatywy, takie jak-of csv=p=0
.Zobacz także
mediainfo
Dobrze znane
mediainfo
narzędzie może wyświetlić liczbę ramek:MP4Box
Dla plików MP4 / M4V / M4A.
MP4Box
z gpac może pokazać liczbę klatek:Zapoznaj się z
Media Info
linią na wyjściu dla danego strumienia wideo:W tym przykładzie strumień wideo ma 2525 klatek.
boxdumper
Dla plików MP4 / M4V / M4A / MOV.
boxdumper
to proste narzędzie z l-smasha. Spowoduje to wyświetlenie dużej ilości informacji. W sekcjistsz
rozmiaru próbki patrzsample_count
liczba ramek. W tym przykładzie wejście ma 1900 klatek wideo:stsz
atom.źródło
ffprobe -v error -select_streams v:0 -show_entries stream=nb_frames -of default=nokey=1:noprint_wrappers=1 input.mkv
W Uniksie działa to jak urok:
źródło
ffmpeg -i 00000.avi -map 0:v:0 -c copy -f null -y /dev/null 2>&1 | grep -Eo 'frame= *[0-9]+ *' | grep -Eo '[0-9]+' | tail -1
Zamiast tego oblicz to na podstawie czasu.
To właśnie robię i działa świetnie dla mnie i wielu innych). Najpierw znajdź długość filmu w poniższym fragmencie:
Powinieneś być w stanie konsekwentnie i bezpiecznie znaleźć,
Duration: hh:mm:ss.nn
aby określić rozmiar źródłowego klipu wideo. Następnie dla każdego wiersza aktualizacji (CR, bez LF) można przeanalizować tekst pod kątem bieżącego znacznika czasu, który znajduje się w:Tylko uważaj, aby nie zawsze oczekiwać doskonałego wyniku z tych linii stanu. Mogą zawierać komunikaty o błędach, takie jak tutaj:
Raz masz czas, to prosta matematyka:
time / durration * 100 = % done
.źródło
TimeSpan
z niego plik , a następnie go używamcurrentDurationTimeSpan.Ticks / (totalDurationTimeSpan.Ticks / 100)
. TimeSpan zapewnia również potężną funkcję Parse, sprawdź toNie wszystkie formaty przechowują liczbę klatek lub całkowity czas trwania - a nawet jeśli tak, plik może być niekompletny - więc ffmpeg domyślnie nie wykrywa dokładnie żadnego z nich.
Zamiast tego spróbuj poszukać końca pliku i odczytaj godzinę, a następnie policz bieżący czas w drodze.
Alternatywnie możesz spróbować
AVFormatContext->nb_index_entries
wykrytego czasu trwania, który powinien działać na dobrze przynajmniej nieuszkodzonym pliku AVI / MOV, lub bibliotece FFMS2, która prawdopodobnie jest zbyt wolna, aby zawracać sobie głowę paskiem postępu.źródło
Spróbuj czegoś takiego:
Zapisuje numer ramki na stderr, więc możesz pobrać z tego ostatnią klatkę.
źródło
ffprobe
Aby uzyskać numer ramki, możesz użyć następujących poleceńffprobe.exe -i video_name -print_format json -loglevel fatal -show_streams -count_frames -select_streams v
które mówią, aby wydrukować dane w
json
formacieselect_streams v
ffprobe
po prostu powie nam, abyśmy przekazali namvideo
dane strumieniowe, a jeśli je usuniesz, dostarczy równieżaudio
informacjia wynik będzie podobny
2. możesz użyć
co da ci strumień danych, jeśli chcesz mieć wybrane informacje, takie jak liczba klatek na sekundę, użyj następującego polecenia
które dają podstawę liczbową na podstawie informacji o filmie, problem polega na tym, że gdy używasz tej metody, możliwe, że otrzymasz plik
N/A
wyjście as.więcej informacji znajdziesz na tej stronie Wskazówki dotyczące FFProbe
źródło
Spróbuj tego:
źródło
*.ts
. Dane wyjściowe to pusty wiersz.Ponieważ mój komentarz otrzymał kilka pozytywnych głosów, pomyślałem, że zostawię to jako odpowiedź:
Powinno to być szybkie, ponieważ nie jest wykonywane żadne kodowanie.
ffmpeg
po prostu zdemuksuje plik i odczyta (zdekoduje) pierwszy strumień wideo tak szybko, jak to możliwe. Pierwszegrep
polecenie pobierze tekst, który pokazuje ramkę. Drugiegrep
polecenie pobierze tylko liczbę z tego.tail
Komenda będzie po prostu pokazać końcową linię (ostateczna liczba ramek).źródło
aby oprzeć się na odpowiedzi stu. oto jak znalazłem liczbę klatek na sekundę dla filmu z mojego telefonu komórkowego. Uruchomiłem przez chwilę następujące polecenie. Pozwoliłem, aby liczba klatek wzrosła do około ~ 10 000, zanim stałem się niecierpliwy i uderzyłem ^ C:
następnie złapałem dwie informacje z tej linii, która zaczyna się od „frame =”, liczba ramek 7989 i czas 00: 04: 26.30. Najpierw musisz przeliczyć czas na sekundy, a następnie podzielić liczbę klatek przez sekundy, aby uzyskać „klatki na sekundę”. „liczba klatek na sekundę” to liczba klatek na sekundę.
szybkość klatek mojego filmu to 30 fps.
źródło
Jedyne dokładne, jakie udało mi się to zrobić, to:
Aby upewnić się, że działa to z wideo:
źródło
ffprobe -i my_video.mp4 -show_frames 2>&1 | grep -c media_type=video
Przepraszam za odpowiedź necro, ale może będzie to potrzebne (ponieważ nie znalazłem rozwiązania dla ostatnich wydań ffmpeg.
Z ffmpeg 3.3.4 znalazłem jedną z następujących rzeczy:
Na koniec wyświetli liczbę klatek. U mnie zadziałało przy filmach z dźwiękiem. Daje jednak dwukrotnie wiersz „nb_frames”, ale pierwsza linia zawierała faktyczną liczbę klatek w testowanych przeze mnie filmach.
źródło
Używam php_ffmpeg, dzięki czemu mogę uzyskać wszystkie czasy i wszystkie klatki filmu. Jak widać
A potem szczegóły są na stronie.
http://ffmpeg-php.sourceforge.net/doc/api/ffmpeg_movie.php
źródło
źródło
linux
rubin
źródło