Um B-frame é um quadro de vídeo que pode usar tanto um quadro anterior quanto um posterior para montar sua imagem. O B significa bidirecional. B-frames oferecem mais compressão do que outros tipos de quadros, o que ajuda a manter o vídeo pequeno.
Nos metadados de um arquivo de vídeo, você pode ver um campo chamado Has B Frames, também escrito has_b_frames. O nome sugere uma resposta sim ou não, mas o valor é um número. Esse número indica quantos quadros um decodificador precisa conseguir manter na memória para exibir o vídeo na ordem correta.
Como os B-frames diferem dos I-frames e P-frames
A compressão de vídeo geralmente funciona comparando quadros e registrando as diferenças entre eles. O vídeo MPEG-2 define estes 3 tipos de quadros:
- I-frame: codificado sem referência a outros quadros, então a decodificação pode começar aqui
- P-frame: pode usar o I-frame ou P-frame anterior
- B-frame: pode usar o I-frame ou P-frame anterior e seguinte
Um B-frame pode depender de um quadro que vem depois no tempo, então esse quadro posterior precisa ser armazenado primeiro. A ordem de armazenamento portanto difere da ordem que você vê na tela. Uma sequência MPEG-2 típica se parece com isto:
- Ordem de exibição:
B1 B2 I3 B4 B5 P6 B7 B8 P9 B10 B11 P12 - Ordem de armazenamento:
I3 B1 B2 P6 B4 B5 P9 B7 B8 P12 B10 B11
Como são os valores
Has B Frames é um número inteiro. O FFmpeg descreve o valor como o tamanho do buffer de reordenação de quadros no decodificador. Para vídeo MPEG-2, o FFmpeg define 2 valores:
0: vídeo de baixa latência com apenas I-frames e P-frames1: vídeo com I-frames, P-frames e B-frames
Codificadores H.264 e HEVC também podem manter alguns B-frames como referência para outros quadros. Os arquivos de teste do FFmpeg para H.264 mostram como isso altera o valor. Os nomes de arquivo indicam as configurações do codificador:
- No máximo 3 B-frames em sequência, nenhum mantido como referência:
1 - No máximo 3 B-frames em sequência, alguns mantidos como referência:
2 - No máximo 4 B-frames em sequência, alguns mantidos como referência:
2
Portanto o valor não é uma contagem de B-frames. O programa ffprobe mostra o tipo de cada quadro como um valor pict_type: I, P ou B. O campo NB Frames informa o número de quadros, mas não seus tipos.
De onde vem o valor
O nome do campo vem do FFmpeg, cujo programa ffprobe imprime has_b_frames para fluxos de vídeo. Um fluxo H.264 pode informar o número em seu próprio cabeçalho. Se o cabeçalho não informar o número, o FFmpeg o deduz a partir dos quadros e de seus tempos.
As configurações do codificador determinam se um vídeo usa B-frames. No FFmpeg e no codificador Microsoft H.264, um valor 0 desativa os B-frames.
Quais arquivos o carregam
O campo existe apenas para fluxos de vídeo. Você pode ver o campo de vídeo em arquivos MP4, MOV, MKV, WebM e AVI. Um arquivo MOV com quadros reordenados também armazena uma tabela com o tempo entre a decodificação e a exibição de cada quadro.
O codec decide se B-frames são possíveis. Vídeo MPEG-2 e o perfil Main do H.264 podem usá-los, mas o perfil Baseline do H.264 não. O VP8, um codec usado em arquivos WebM, não tem B-frames, porque seus quadros nunca são previstos a partir de quadros posteriores.
Por que isso é importante
B-frames ajudam a manter o vídeo pequeno, mas acrescentam atraso. O codificador precisa reordenar os quadros antes de armazená-los, e esse atraso depende do número de B-frames em sequência.
Vídeo reordenado também tem 2 tempos diferentes para cada quadro: quando decodificar o quadro e quando exibi-lo. O FFmpeg fornece ambos como carimbos de tempo na base de tempo do fluxo.