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 valoryuv420pnão tem número aqui e usa 8 bits.le: a ordem de bytes, little-endian. A terminaçãobesignifica 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 alturayuv422p: 16 bits, cor com metade da largurayuv444p: 24 bits, cor em cada pixelyuvj420p: 12 bits, o layoutyuv420pcom a faixa completa que o JPEG usargb24: 24 bits, vermelho, verde e azul em formato packedrgba: 32 bits, com um valor alfa extra para transparênciagray: 8 bits, apenas brilhopal8: 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.