Ir para o conteúdo
AZ Tools

Inspetor de contêiner Ogg

Um arquivo Ogg não é um códec, é um contêiner: uma sequência plana de páginas, cada uma carregando um fragmento de algum fluxo lógico. Este inspetor percorre todas as páginas e mostra o que o cabeçalho de 27 bytes realmente guarda: o padrão de captura OggS, a versão, os sinalizadores de tipo que marcam o início de um fluxo, o seu fim ou um pacote continuado da página anterior, a posição de grânulo de 64 bits, o número de série do fluxo a que a página pertence, o número de sequência e o CRC32. Em seguida recalcula essa soma de verificação sobre a página com o campo do CRC zerado, usando o polinômio não refletido 0x04C11DB7 que o Ogg especifica em vez do CRC-32 refletido do zlib, e mostra o valor armazenado ao lado do calculado. A tabela de segmentos é a parte que ninguém mais exibe. Até 255 valores de lacing dizem como a página se divide em pacotes, e um valor de exatamente 255 não encerra um pacote: indica que ele continua no segmento seguinte e, se for o último valor da página, na página seguinte. É assim que um cabeçalho de comentários com capa embutida viaja espalhado por dezenas de páginas cuja posição de grânulo é -1, porque em nenhuma delas termina um pacote. Depois as páginas são agrupadas por número de série em fluxos lógicos e o cabeçalho de identificação de cada um é decodificado: Vorbis, Opus, FLAC em Ogg, Theora e Speex, com os comentários lidos como o multimapa que são, chaves repetidas inclusive. E duas perguntas ganham resposta que nenhum reprodutor dá: os fluxos estão intercalados (multiplexados, vídeo com o seu áudio) ou um depois do outro (encadeados, o que resulta de concatenar dois arquivos Ogg)? E cada fluxo tem página de início e de fim, já que um download truncado fica sem a de fim, ainda toca e informa a duração errada a quem perguntar.

Como usar

  1. Solte um arquivo .ogg, .oga, .ogv, .opus ou .spx na caixa. Ele é lido inteiro, porque a duração está na posição de grânulo da última página.
  2. Comece pelos blocos do contêiner: quantos fluxos lógicos existem, se estão multiplexados ou encadeados e se todos os CRC de página conferem.
  3. Abra o bloco de cada fluxo para os detalhes do códec — canais e taxa no Vorbis, pre-skip e mapeamento de canais no Opus, profundidade de bits e total de amostras no FLAC em Ogg — além do fabricante e de todos os campos de comentário na ordem do arquivo.
  4. Percorra os sinalizadores na tabela de páginas: BOS na primeira página de um fluxo, EOS na última e cont em qualquer página que comece no meio de um pacote.
  5. Confira os avisos. Uma página de fim ausente, um CRC que não confere ou um salto nos números de sequência apontam cada um uma avaria específica do arquivo.

Perguntas frequentes

Por que meu fluxo Opus mostra 16 kHz numa linha e 48 kHz noutra?
Porque são coisas diferentes. A taxa de entrada do cabeçalho OpusHead é documentação: registra o que foi entregue ao codificador para que um decodificador possa reamostrar de volta se quiser. O Opus tem uma única taxa interna, 48 kHz, e é também nela que suas posições de grânulo contam, então um arquivo de um segundo gravado a 16 kHz termina num grânulo de cerca de 48 312 e não de 16 000. Ler a taxa de entrada como se fosse a de reprodução é o erro clássico com Opus e distorce qualquer duração calculada pela razão entre as duas.
O que é uma posição de grânulo e por que algumas páginas mostram -1?
A posição de grânulo é o relógio do próprio códec, escrito no fim de cada página: no Vorbis e no FLAC é o número da última amostra decodificável a partir dela, no Opus é o mesmo em amostras de 48 kHz incluindo o pre-skip, e no Theora é um par empacotado de quadro-chave e deslocamento. Uma página mostra -1 (todos os 64 bits em um) quando nenhum pacote termina nela, o que acontece sempre que um pacote é grande o bastante para atravessar páginas. Não é avaria: é o único valor honesto, porque a página acaba no meio de algo.
A ferramenta diz que meu arquivo está encadeado. O que isso quer dizer?
Um arquivo encadeado são dois ou mais fluxos Ogg completos postos um depois do outro, cada um com seu número de série, seus cabeçalhos e suas páginas de início e de fim. É exatamente o que sai de `cat a.ogg b.ogg`, e a especificação permite. O que a especificação não faz é alinhar os reprodutores: uns tocam a cadeia inteira, outros param no fim do primeiro elo, outros tocam tudo mas anunciam a duração do primeiro. Se você queria um arquivo contínuo, recodifique em vez de concatenar.
Uma página falha na verificação de CRC. O arquivo está quebrado?
Algo mudou depois que a página foi escrita, sim, mas não necessariamente o áudio. O CRC do Ogg cobre a página inteira, cabeçalho incluído, então um editor de etiquetas que corrigiu um byte no lugar sem recalcular a soma deixa exatamente esse rastro, assim como um bit invertido por armazenamento ruim ou um download interrompido e retomado. Note que não é o CRC-32 do zlib: o Ogg usa o polinômio 0x04C11DB7 sem reflexão de entrada nem de saída e sem inversão final, calculado com o campo da soma zerado, e é por isso que ferramentas que recorrem à rotina habitual dão todas as páginas como ruins.
Por que um pacote se espalha por trinta páginas?
Porque uma página comporta no máximo 255 segmentos de no máximo 255 bytes, ou seja, o teto é 65 025 bytes, e um cabeçalho de comentários com capa embutida passa disso sem esforço. A tabela de segmentos codifica o transbordo terminando a página num valor de lacing de 255, que significa «não terminou»; a página seguinte liga o sinalizador de continuação e retoma de onde a anterior parou. É também por isso que não dá para cortar um Ogg em qualquer fronteira de página e esperar que as duas metades funcionem.
A duração aqui não bate com a do meu reprodutor. Qual está certa?
Olhe primeiro o sinalizador de fim de fluxo. Esta página calcula a duração pela posição de grânulo da última página que encontra, menos o pre-skip no caso do Opus; se aquele fluxo não tem página de fim, o arquivo foi truncado e nenhum número significa muito, e seu reprodutor pode estar extrapolando pela taxa de bits. Num arquivo encadeado as durações são somadas aqui, enquanto muitos reprodutores anunciam só a do primeiro elo. E no Opus, esquecer de subtrair o pre-skip alonga cada arquivo em cerca de 6,5 milissegundos.

Ferramentas relacionadas