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
- 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.
- 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.
- 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.
- 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.
- 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
Inspetor de metadados FLAC
Abra um .flac no navegador: STREAMINFO, cada bloco de metadados com sua posição, comentários Vorbis repetidos, capas e a taxa de compressão real.
Inspetor de arquivos gzip (.gz)
Leia o cabeçalho de um .gz campo a campo, percorra todos os membros e verifique o trailer recalculando o CRC32 e o tamanho real no navegador.
Inspetor de bancos de dados SQLite
Abra um arquivo .sqlite ou .db no navegador e leia sua estrutura: tamanho de página, codificação, modo de journal e as linhas reais de cada tabela.
Visualizador de arquivos mbox
Divide um arquivo .mbox no navegador: limites de mensagem, cabeçalhos decodificados, estrutura MIME, tópicos e Message-ID duplicados. Nada é enviado.
Inspetor de arquivos MP4 e ISO base media
Abra um MP4, M4A, M4V ou MOV no navegador: marcas, verificação de início rápido, árvore de caixas, codec e duração de cada faixa e tags do iTunes.
Inspetor de binários Mach-O
Abra um binário de macOS ou iOS no navegador: arquiteturas de um arquivo universal, segmentos e seções, dylibs, rpaths, UUID e assinatura.