NB Frames ist die Anzahl der Frames in einem Stream einer Video- oder Audiodatei. Die Buchstaben NB stehen für "number" (Zahl). FFmpeg und sein Programm ffprobe nennen dieses Feld nb_frames.
Eine Datei kann mehrere Streams enthalten, und jeder Stream hat seinen eigenen NB-Frames-Wert. Eine Datei mit einem Videostream und einem Audiostream hat also 2 separate Zähler. NB Streams ist ein anderer Wert: Er zählt die Streams in der Datei, nicht die Frames in einem Stream.
Was ein Frame ist
In einem Videostream ist ein Frame ein einzelnes Standbild des Videos. In einem Audiostream hängt die Bedeutung vom Format ab.
In AIFF enthält ein Sampleframe ein Sample für jeden Audiokanal. In MP3 ist ein Frame ein größerer Block, und FFmpeg multipliziert die Anzahl der Frames mit der Anzahl der Samples pro Frame, um die Länge zu berechnen. Du kannst deshalb eine Audioanzahl aus einem Format nicht direkt mit einer Anzahl aus einem anderen Format vergleichen.
Wie die Werte aussehen
Der Wert ist eine ganze Zahl, wenn er bekannt ist. Diese Werte erscheinen im Code, in der Dokumentation und in den Testergebnissen von FFmpeg:
708: der Zähler für einen Videostream in einer der Testdateien von FFmpeg.1: der Zähler für ein einzelnes Standbild in einer HEIC-Datei.0: der Wert, den FFmpegs Programmierschnittstelle verwendet, wenn die Anzahl nicht bekannt ist.N/A: der Text, den die Standardausgabe von ffprobe ausgibt, wenn der Wert 0 ist. In der JSON- und XML-Ausgabe wird das Feld weggelassen.
Ein Wert von 0 oder N/A oder ein fehlendes Feld bedeutet nicht, dass der Stream leer ist. Der Wert sagt nur, dass FFmpeg in diesem Feld keinen Zähler gesetzt hat.
Woher der Wert kommt
NB Frames stammt normalerweise aus der Struktur der Datei selbst, sodass FFmpeg die Frames nicht zählen muss. Die Quelle hängt vom Format ab:
- MP4 und MOV: FFmpeg addiert die Sampleanzahlen in der "time-to-sample"-Tabelle, also im
stts-Atom. - AVI: FFmpeg liest eine 32-Bit-Zahl aus dem Stream-Header, also dem
strh-Chunk. - AIFF: FFmpeg liest das Feld
numSampleFramesaus dem Common Chunk. - WAV, MP3, FLAC und MKV: Die FFmpeg-Leser für diese Formate setzen den Wert nicht, daher gibt die Standardausgabe von ffprobe
N/Aaus.
Eine MKV-Datei kann trotzdem einen Zähler unter einem anderen Namen enthalten. Das Programm mkvmerge schreibt für jeden Track ein Tag mit dem Namen NUMBER_OF_FRAMES.
Wie du die Frames zählst
NB Frames wiederholt nur die Zahl in der Dateistruktur. Diese Zahl beweist nicht, dass wirklich alle Frames in der Datei vorhanden sind. In einer MOV-Testdatei von FFmpeg ist zum Beispiel ein Zähler von 708 gespeichert, aber ffprobe liest nur 66 Pakete und 65 Frames aus dieser Datei.
Um die Anzahl zu messen, führe ffprobe mit den Optionen -show_streams und -count_frames aus. Das Programm ffprobe dekodiert dann den Stream und meldet das Ergebnis in einem eigenen Feld, nb_read_frames. Das dauert länger, weil ffprobe jedes Frame dekodieren muss.
Verwende diese Prüfung für Videostreams. In einer AIFF-Datei zählt ffprobe dekodierte Blöcke, die jeweils viele Sampleframes enthalten, daher unterscheiden sich die beiden Zahlen selbst in einer vollständigen Datei.
Die Option -count_packets, ebenfalls zusammen mit -show_streams verwendet, zählt Pakete ohne sie zu dekodieren und meldet das Ergebnis in nb_read_packets. Ein Videopaket enthält typischerweise ein komprimiertes Frame, ein Audiopaket kann jedoch mehrere enthalten.
Warum es wichtig ist
Für einen Videostream ergeben der Framezähler und die Dauer zusammen die durchschnittliche Bildrate. Der MP4- und MOV-Leser von FFmpeg berechnet die Rate aus einem Framezähler und einer Dauer. In derselben Testdatei ergeben 708 Frames über 23,613333 Sekunden etwa 29,98 Frames pro Sekunde.
Die Anzahl hilft dir auch, eine Videodatei zu prüfen. Wenn ein gemessener Zähler deutlich unter dem gespeicherten Zähler liegt, fehlen möglicherweise Teile der Videodaten.