Słownik

Co oznacza NB Frames?

NB Frames informuje, ile klatek zawiera strumień wideo lub audio. FFmpeg nie podaje tej liczby dla każdego formatu, więc wartość może być nieznana.

nb-frames

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 numSampleFrames z 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ć.