Un B-frame è un fotogramma video che può usare sia un fotogramma precedente sia uno successivo per costruire l'immagine. La B sta per bidirezionale. I B-frame offrono più compressione degli altri tipi di fotogramma, il che aiuta a mantenere il video di dimensioni ridotte.
Nei metadati di un file video, potresti vedere un campo chiamato Has B Frames, indicato anche come has_b_frames. Il nome fa pensare a una risposta sì o no, ma il valore è un numero. Il numero indica quanti fotogrammi un decoder deve poter mantenere in memoria per mostrare il video nell'ordine corretto.
In cosa le B-frame differiscono dalle I-frame e dalle P-frame
La compressione video in genere funziona confrontando i fotogrammi e registrando le differenze tra loro. Il video MPEG-2 definisce questi 3 tipi di fotogramma:
- I-frame: codificato senza riferimento ad altri fotogrammi, quindi la decodifica può iniziare da qui
- P-frame: può usare l'I-frame o il P-frame precedente
- B-frame: può usare l'I-frame o il P-frame precedente e successivo
Un B-frame può dipendere da un fotogramma che arriva più tardi nel tempo, quindi quel fotogramma successivo deve essere memorizzato per primo. L'ordine di memorizzazione è quindi diverso dall'ordine che vedi sullo schermo. Una tipica sequenza MPEG-2 è la seguente:
- Ordine di visualizzazione:
B1 B2 I3 B4 B5 P6 B7 B8 P9 B10 B11 P12 - Ordine di memorizzazione:
I3 B1 B2 P6 B4 B5 P9 B7 B8 P12 B10 B11
Come appaiono i valori
Has B Frames è un numero intero. FFmpeg descrive il valore come la dimensione del buffer di riordinamento dei fotogrammi nel decoder. Per il video MPEG-2, FFmpeg indica 2 valori:
0: video a bassa latenza con soli I-frame e P-frame1: video con I-frame, P-frame e B-frame
Anche i codificatori H.264 e HEVC possono mantenere alcuni B-frame come riferimento per altri fotogrammi. I file di test di FFmpeg per H.264 mostrano come questo modifica il valore. I nomi dei file indicano le impostazioni del codificatore:
- Al massimo 3 B-frame di seguito, nessuno mantenuto come riferimento:
1 - Al massimo 3 B-frame di seguito, alcuni mantenuti come riferimento:
2 - Al massimo 4 B-frame di seguito, alcuni mantenuti come riferimento:
2
Quindi il valore non è il conteggio dei B-frame. Il programma ffprobe mostra il tipo di ogni fotogramma come valore pict_type: I, P o B. Il campo NB Frames indica il numero di fotogrammi, ma non i loro tipi.
Da dove proviene il valore
Il nome del campo proviene da FFmpeg, il cui programma ffprobe stampa has_b_frames per i flussi video. Un flusso H.264 può indicare il numero nel proprio header. Se l'header non indica il numero, FFmpeg lo ricava dai fotogrammi e dai loro tempi.
Le impostazioni del codificatore decidono se un video usa B-frame. In FFmpeg e nel codificatore Microsoft H.264, un'impostazione pari a 0 disattiva i B-frame.
Quali file lo contengono
Il campo esiste solo per i flussi video. Puoi vedere il campo per il video nei file MP4, MOV, MKV, WebM e AVI. Un file MOV con fotogrammi riordinati memorizza anche una tabella con il tempo tra decodifica e visualizzazione per ogni fotogramma.
Il codec decide se i B-frame sono possibili. Il video MPEG-2 e il profilo H.264 Main possono usarli, ma il profilo H.264 Baseline no. VP8, un codec usato nei file WebM, non ha B-frame, perché i suoi fotogrammi non vengono mai predetti da fotogrammi successivi.
Perché è importante
I B-frame aiutano a mantenere il video di dimensioni ridotte, ma aggiungono latenza. Il codificatore deve riordinare i fotogrammi prima di memorizzarli e questa latenza dipende dal numero di B-frame di seguito.
Il video riordinato ha anche 2 tempi diversi per ogni fotogramma: quando decodificare il fotogramma e quando mostrarlo. FFmpeg fornisce entrambi come timestamp nella base dei tempi del flusso.