Dizionario

Cosa significa NB Frames?

NB Frames ti dice quanti fotogrammi contiene un flusso video o audio. FFmpeg non riporta questo numero per ogni formato, quindi il valore può essere sconosciuto.

nb-frames

NB Frames indica il numero di frame in uno stream di un file video o audio. Le lettere NB stanno per "number" (numero). FFmpeg e il suo programma ffprobe chiamano questo campo nb_frames.

Un file può contenere diversi stream e ogni stream ha il proprio valore NB Frames. Un file con uno stream video e uno audio ha quindi 2 conteggi separati. NB Streams è un valore diverso: conta gli stream nel file, non i frame dentro uno stream.

Che cos'è un frame

In uno stream video, un frame è una singola immagine del video. In uno stream audio, il significato dipende dal formato.

In AIFF, un sample frame contiene un campione per ogni canale audio. In MP3, un frame è un blocco più grande e FFmpeg moltiplica il numero di frame per i campioni per frame per ottenere la durata. Non puoi quindi confrontare direttamente un conteggio audio di un formato con il conteggio di un altro formato.

Come appaiono i valori

Il valore è un numero intero quando è noto. Questi valori compaiono nel codice, nella documentazione e nei risultati dei test di FFmpeg:

  • 708: il conteggio per uno stream video in uno dei file di test di FFmpeg.
  • 1: il conteggio per una singola immagine fissa in un file HEIC.
  • 0: il valore che l'interfaccia di programmazione di FFmpeg usa quando il numero non è noto.
  • N/A: il testo che l'output predefinito di ffprobe stampa quando il valore è 0. Il suo output JSON e XML omette il campo.

Un valore di 0 o N/A, o un campo mancante, non ti dice che lo stream è vuoto. Il valore dice solo che FFmpeg non ha impostato alcun conteggio in questo campo.

Da dove proviene il valore

NB Frames di solito proviene dalla struttura interna del file, quindi FFmpeg non deve contare i frame. L'origine dipende dal formato:

  • MP4 e MOV: FFmpeg somma i conteggi dei campioni nella time-to-sample table, che è l'atomo stts.
  • AVI: FFmpeg legge un numero a 32 bit dall'header dello stream, che è il chunk strh.
  • AIFF: FFmpeg legge il campo numSampleFrames dal Common Chunk.
  • WAV, MP3, FLAC e MKV: i reader di FFmpeg per questi formati non impostano il valore, quindi l'output predefinito di ffprobe stampa N/A.

Un file MKV può comunque contenere un conteggio con un altro nome. Il programma mkvmerge scrive un tag chiamato NUMBER_OF_FRAMES per ogni traccia.

Come contare i frame

NB Frames si limita a ripetere il numero presente nella struttura del file. Questo numero non dimostra che tutti i frame siano davvero nel file. Un file MOV di test in FFmpeg memorizza un conteggio di 708, ma ffprobe legge solo 66 pacchetti e 65 frame da quel file.

Per misurare il conteggio, esegui ffprobe con le opzioni -show_streams e -count_frames. Il programma ffprobe quindi decodifica lo stream e riporta il risultato in un campo separato, nb_read_frames. Questo richiede più tempo, perché ffprobe deve decodificare ogni frame.

Usa questo controllo per gli stream video. In un file AIFF, ffprobe conta i blocchi decodificati che contengono molti sample frame, quindi i due numeri differiscono anche in un file completo.

L'opzione -count_packets, anch'essa usata con -show_streams, conta i pacchetti senza decodarli e riporta il risultato in nb_read_packets. Un pacchetto video di solito contiene un frame compresso, ma un pacchetto audio può contenerne diversi.

Perché è importante

Per uno stream video, il conteggio dei frame e la durata insieme danno il frame rate medio. Il reader MP4 e MOV di FFmpeg calcola il rate da un conteggio di frame e da una durata. Nello stesso file di test, 708 frame in 23,613333 secondi danno circa 29,98 frame al secondo.

Il conteggio ti aiuta anche a controllare un file video. Se un conteggio misurato è molto inferiore al conteggio memorizzato, una parte dei dati video potrebbe mancare.