NB Frames oznacza liczbę klatek w jednym strumieniu pliku wideo lub audio. Litery NB są skrótem od „number” (liczba). FFmpeg i jego program ffprobe używają dla tego pola nazwy nb_frames.
Plik może zawierać kilka strumieni, a każdy strumień ma własną wartość NB Frames. Plik z jednym strumieniem wideo i jednym strumieniem audio ma więc 2 osobne wartości. NB Streams to inna wartość: zlicza strumienie w pliku, a nie klatki w jednym strumieniu.
Czym jest klatka
W strumieniu wideo klatka to jeden nieruchomy obraz wideo. W strumieniu audio znaczenie zależy od formatu.
W AIFF jedna klatka próbki zawiera po jednej próbce dla każdego kanału audio. W MP3 klatka to większy blok i FFmpeg mnoży liczbę klatek przez liczbę próbek w klatce, aby obliczyć długość. Dlatego nie możesz bezpośrednio porównywać liczby dla audio z jednego formatu z liczbą z innego formatu.
Jak wyglądają wartości
Gdy wartość jest znana, jest liczbą całkowitą. W kodzie, dokumentacji i wynikach testów FFmpeg pojawiają się takie wartości:
708: liczba dla strumienia wideo w jednym z plików testowych FFmpeg.1: liczba dla pojedynczego nieruchomego obrazu w pliku HEIC.0: wartość, której interfejs programistyczny FFmpeg używa, gdy liczba nie jest znana.N/A: tekst, który domyślne wyjście ffprobe wypisuje, gdy wartość wynosi 0. W wyjściu JSON i XML to pole jest pomijane.
Wartość 0 lub N/A, albo brak pola, nie oznacza, że strumień jest pusty. Ta wartość jedynie mówi, że FFmpeg nie ustawił w tym polu żadnej liczby.
Skąd pochodzi wartość
NB Frames zazwyczaj pochodzi z samej struktury pliku, więc FFmpeg nie musi zliczać klatek. Źródło zależy od formatu:
- MP4 i MOV: FFmpeg sumuje liczby próbek w tabeli time-to-sample, czyli atomie
stts. - AVI: FFmpeg odczytuje 32‑bitową liczbę z nagłówka strumienia, czyli fragmentu
strh. - AIFF: FFmpeg odczytuje pole
numSampleFramesz Common Chunk. - WAV, MP3, FLAC i MKV: czytniki FFmpeg dla tych formatów nie ustawiają wartości, więc domyślne wyjście ffprobe wypisuje
N/A.
Plik MKV może mimo to zawierać tę liczbę pod inną nazwą. Program mkvmerge zapisuje dla każdej ścieżki znacznik o nazwie NUMBER_OF_FRAMES.
Jak liczyć klatki
NB Frames jedynie powtarza liczbę obecną w strukturze pliku. Ta liczba nie dowodzi, że wszystkie klatki faktycznie są w pliku. W jednym pliku testowym MOV w FFmpeg zapisano liczbę 708, ale ffprobe odczytuje z tego pliku tylko 66 pakietów i 65 klatek.
Aby zmierzyć liczbę, uruchom ffprobe z opcjami -show_streams i -count_frames. Program ffprobe dekoduje wtedy strumień i zwraca wynik w osobnym polu, nb_read_frames. Zajmuje to więcej czasu, ponieważ ffprobe musi zdekodować każdą klatkę.
Używaj tego sprawdzenia dla strumieni wideo. W pliku AIFF ffprobe zlicza zdekodowane bloki, z których każdy zawiera wiele klatek próbek, więc obie liczby różnią się nawet w kompletnym pliku.
Opcja -count_packets, również używana z -show_streams, zlicza pakiety bez ich dekodowania i zwraca wynik w nb_read_packets. Pakiet wideo zazwyczaj zawiera jedną skompresowaną klatkę, ale pakiet audio może zawierać ich kilka.
Dlaczego ma to znaczenie
Dla strumienia wideo liczba klatek razem z czasem trwania daje średnią liczbę klatek na sekundę. Czytnik MP4 i MOV w FFmpeg oblicza tę wartość na podstawie liczby klatek i czasu trwania. W tym samym pliku testowym 708 klatek w 23,613333 sekundy daje około 29,98 klatki na sekundę.
Ta liczba pomaga też sprawdzić plik wideo. Jeśli zmierzona liczba jest dużo niższa niż zapisana, część danych wideo może brakować.