Dicionário

O que é formato de pixel?

Pixel format é a forma como um vídeo ou imagem organiza os dados de cor de cada pixel. Saiba o que valores como yuv420p significam para seu arquivo.

pixel-format

Pixel format é o layout de cada pixel nos dados brutos de imagem de uma foto ou vídeo. Ele informa ao programa quais componentes de cor a imagem tem e quantos bits cada um usa.

Relatórios de vídeo costumam mostrar o campo como pix_fmt, com um valor como yuv420p. Um valor assim mostra o modelo de cor, a subamostragem de croma e a profundidade de bits. O espaço de cor é um campo separado.

Quais arquivos o carregam

O programa ffprobe do FFmpeg lista pix_fmt para cada fluxo de vídeo. Isso vale para arquivos MP4, MOV, MKV e WebM.

Imagens também informam um valor. O FFmpeg atribui yuvj420p a um JPEG com amostragem 4:2:0 e rgb24 a um PNG RGB de 8 bits.

Um arquivo de áudio com capa também pode informar um pixel format. O FFmpeg trata essa imagem como um fluxo de vídeo.

O ExifTool lê uma tag chamada PixelFormat em arquivos Windows HD Photo (HDP e WDP). Ela mostra valores como 24-bit RGB e 8-bit Gray.

Como são os valores

O FFmpeg monta esses nomes a partir de partes curtas. O valor yuv420p10le tem 5 partes:

  • yuv: o modelo de cor. Y é brilho, e U e V carregam a cor. U e V também são chamados de Cb e Cr, como em YCbCr.
  • 420: a amostragem. A cor tem metade da largura e metade da altura dos dados de brilho.
  • p: planar. Cada componente tem um plano separado. Um formato packed mantém os componentes juntos em um único array.
  • 10: os bits de cada componente. O valor yuv420p não tem número aqui e usa 8 bits.
  • le: a ordem de bytes, little-endian. A terminação be significa big-endian.

Valores típicos

Cada número abaixo é a média de bits por pixel nos dados brutos de imagem:

  • yuv420p: 12 bits, cor com metade da largura e metade da altura
  • yuv422p: 16 bits, cor com metade da largura
  • yuv444p: 24 bits, cor em cada pixel
  • yuvj420p: 12 bits, o layout yuv420p com a faixa completa que o JPEG usa
  • rgb24: 24 bits, vermelho, verde e azul em formato packed
  • rgba: 32 bits, com um valor alfa extra para transparência
  • gray: 8 bits, apenas brilho
  • pal8: 8 bits, cada valor aponta para uma cor da paleta

Na faixa completa, o brilho em 8 bits vai de 0 a 255. Na faixa limitada, vai de 16 a 235. O FFmpeg recomenda um campo de faixa separado em vez dos nomes yuvj.

De onde vem o valor

O programa que codifica o fluxo decide o pixel format. No FFmpeg, você o escolhe com a opção -pix_fmt.

O próprio nome geralmente não é armazenado no arquivo. O programa de leitura monta o nome a partir dos detalhes salvos.

Para H.264, o FFmpeg usa a profundidade de bits e o formato de croma no cabeçalho do fluxo. Para PNG, o FFmpeg usa a profundidade de bits e o tipo de cor no cabeçalho da imagem.

Por que isso é importante para o seu arquivo

O pixel format define o tamanho dos dados brutos de imagem. Um quadro rgb24 tem 24 bits por pixel, e um quadro yuv420p tem 12. Os codecs depois comprimem esses dados, então esses números não indicam o tamanho final do arquivo.

O pixel format também define quanto detalhe de cor o arquivo preserva. O olho humano percebe muito mais detalhe em brilho do que em cor, então 4:2:0 causa pouca perda visível.

Se você converter 4:2:0 para 4:4:4, o programa calcula as amostras que faltam a partir das vizinhas. O detalhe de cor que 4:2:0 removeu continua perdido.

O perfil H.264 é outro motivo para conferir o valor. Os perfis Main e High suportam cor de 8 bits com amostragem 4:2:0.

Um fluxo H.264 em yuv444p ou yuv420p10le precisa de um perfil mais alto. As regras de HLS da Apple exigem H.264 em perfil High ou inferior. O YouTube recomenda o perfil High com 4:2:0 para envios.