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
numSampleFramesdo 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.