Dicionário

O que significa nb_frames?

NB Frames informa quantos frames um fluxo de vídeo ou áudio possui. O FFmpeg não informa esse número para todos os formatos, portanto o valor pode ser desconhecido.

nb-frames

nb_frames significa o número de frames em um fluxo de um arquivo de vídeo ou áudio. As letras NB significam "number" (número). O FFmpeg e seu programa ffprobe chamam esse campo de nb_frames.

Um arquivo pode ter vários fluxos, e cada fluxo tem seu próprio valor de nb_frames. Um arquivo com um fluxo de vídeo e um fluxo de áudio, portanto, tem 2 contagens separadas. NB Streams é um valor diferente: ele conta os fluxos no arquivo, não os frames dentro de um fluxo.

O que é um frame

Em um fluxo de vídeo, um frame é uma imagem estática do vídeo. Em um fluxo de áudio, o significado depende do formato.

Em AIFF, um frame de amostra contém uma amostra para cada canal de áudio. Em MP3, um frame é um bloco maior, e o FFmpeg multiplica a contagem de frames pelo número de amostras por frame para obter o comprimento. Por isso você não pode comparar diretamente uma contagem de áudio de um formato com a contagem de outro formato.

Como são os valores

O valor é um número inteiro quando é conhecido. Estes valores aparecem no código, na documentação e nos resultados de teste do FFmpeg:

  • 708: a contagem para um fluxo de vídeo em um dos arquivos de teste do FFmpeg.
  • 1: a contagem para uma única imagem estática em um arquivo HEIC.
  • 0: o valor que a interface de programação do FFmpeg usa quando o número não é conhecido.
  • N/A: o texto que a saída padrão do ffprobe mostra quando o valor é 0. Suas saídas JSON e XML omitem o campo.

Um valor 0 ou N/A, ou um campo ausente, não informa que o fluxo está vazio. O valor só informa que o FFmpeg não definiu nenhuma contagem nesse campo.

De onde vem o valor

nb_frames normalmente vem da própria estrutura do arquivo, então o FFmpeg não precisa contar os frames. A origem depende do formato:

  • MP4 e MOV: o FFmpeg soma as contagens de amostras na tabela time-to-sample, que é o átomo stts.
  • AVI: o FFmpeg lê um número de 32 bits do cabeçalho do fluxo, que é o chunk strh.
  • AIFF: o FFmpeg lê o campo numSampleFrames do Common Chunk.
  • WAV, MP3, FLAC e MKV: os leitores do FFmpeg para esses formatos não definem o valor, então a saída padrão do ffprobe mostra N/A.

Um arquivo MKV ainda pode ter uma contagem com outro nome. O programa mkvmerge grava uma tag chamada NUMBER_OF_FRAMES para cada faixa.

Como contar os frames

nb_frames apenas repete o número na estrutura do arquivo. Esse número não prova que todos os frames estão realmente no arquivo. Um arquivo de teste MOV do FFmpeg armazena uma contagem de 708, mas o ffprobe lê apenas 66 pacotes e 65 frames desse arquivo.

Para medir a contagem, execute o ffprobe com as opções -show_streams e -count_frames. O programa ffprobe então decodifica o fluxo e informa o resultado em um campo separado, nb_read_frames. Isso leva mais tempo, porque o ffprobe precisa decodificar cada frame.

Use essa verificação para fluxos de vídeo. Em um arquivo AIFF, o ffprobe conta blocos decodificados que contêm muitos frames de amostra, então os dois números diferem mesmo em um arquivo completo.

A opção -count_packets, também usada com -show_streams, conta pacotes sem decodificá-los e informa o resultado em nb_read_packets. Um pacote de vídeo normalmente contém um frame compactado, mas um pacote de áudio pode conter vários.

Por que isso é importante

Para um fluxo de vídeo, a contagem de frames e a duração juntas fornecem a taxa de frames média. O leitor de MP4 e MOV do FFmpeg calcula a taxa a partir de uma contagem de frames e de uma duração. No mesmo arquivo de teste, 708 frames em 23,613333 segundos resultam em aproximadamente 29,98 frames por segundo.

A contagem também ajuda você a verificar um arquivo de vídeo. Se uma contagem medida ficar muito abaixo da contagem armazenada, parte dos dados de vídeo pode estar faltando.