Dicionário

O que são b frames em um vídeo?

Um B-frame é um quadro de vídeo que pode usar tanto um quadro anterior quanto um posterior. Saiba como os B-frames funcionam e o que o valor Has B Frames no seu arquivo significa.

b-frames

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-frames
  • 1: 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.