Inspetor de arquivos MP4 e ISO base media
Lê um arquivo ISO base media caixa por caixa, no navegador e sem enviar nada: .mp4, .m4a, .m4v e o .mov do QuickTime são o mesmo contêiner com marcas diferentes carimbadas no ftyp. A primeira coisa que ele responde é se o arquivo tem início rápido. A caixa moov guarda o índice de todas as amostras do arquivo; se ela vem depois da mdat, um player não consegue começar até o último byte chegar, e é por isso que um vídeo que abre na hora a partir do disco fica parado um minuto quando os mesmos bytes são servidos por HTTP. Abaixo vem a árvore de caixas com o tipo, o deslocamento, o tamanho declarado e o peso de cada caixa dentro do arquivo, aninhados, de modo que fica claro num relance se o que ocupa espaço é a mídia, uma capa grande demais ou uma caixa free esquecida por um editor. Para cada faixa ele informa o identificador, se o handler é vídeo, áudio, legenda ou hint, o codec lido da entrada de amostra e, quando a caixa de configuração está lá para ser lida, a string RFC 6381 completa: avc1.42C01E do avcC, mp4a.40.2 dos descritores do esds, vp09.00.30.08 do vpcC. Faixas de vídeo acrescentam o tamanho do quadro e as de áudio a taxa de amostragem e o número de canais. As durações aparecem como a contagem bruta de ticks sobre a escala de tempo que a divide, porque uma duração de 15360 não significa nada até se saber se a escala é 600 ou 15360, e porque o cabeçalho do filme não é a palavra final: uma faixa pode durar mais do que ele, e um arquivo fragmentado normalmente o deixa em zero e coloca o total em mvex/mehd. As datas de criação e modificação são convertidas da época de 1904 que o ISO BMFF herdou do QuickTime, e aparecem como não definidas quando o multiplexador as deixou em zero, o que é o mais comum. Nenhum tamanho declarado é aceito de olhos fechados: uma caixa que reivindica mais bytes do que a caixa pai contém é recusada com um erro nomeado em vez de seguida, o tamanho 0 é lido como "até o fim", o tamanho 1 como um tamanho de 64 bits, e o tipo estendido de 16 bytes de uma caixa uuid é pulado antes da carga útil. O que ele não faz é decodificar: não consegue dizer se a imagem continua íntegra depois dos cabeçalhos, se o áudio é silêncio ou qual taxa de bits o codificador realmente atingiu, apenas o que o contêiner diz de si mesmo.
Como usar
- Solte um .mp4, .m4a, .m4v ou .mov sobre a caixa. Só as caixas de cabeçalho são lidas, então um filme de vários gigabytes abre tão rápido quanto um clipe curto.
- Olhe primeiro a linha de início rápido. Se disser que não, o navegador precisa baixar o arquivo inteiro antes de tocar um segundo: remultiplexe com a moov na frente antes de publicar.
- Confira a marca principal e as compatíveis quando um player recusar o arquivo: "qt " é um filme QuickTime que só declara compatibilidade com QuickTime, enquanto "isom" ou "mp42" é o que um player web espera.
- Abra uma faixa para ver o codec, a escala de tempo e a duração próprias dela, e o tamanho do quadro ou a taxa de amostragem. Divida a duração pela escala para obter segundos; os dois são mostrados para a conta ficar à vista.
- Percorra a árvore de caixas atrás de algo grande demais. Num arquivo pequeno, uma capa ou uma caixa free esquecida pode ser uma fatia surpreendente do total, e a coluna de peso deixa isso evidente.
Perguntas frequentes
- O que o início rápido muda de fato, e como conserto um arquivo que não o tem?
- A caixa moov é o índice: ela lista o tamanho, o instante e o deslocamento em bytes de cada amostra do arquivo. Um player precisa dela antes de decodificar qualquer coisa, então quando a moov é escrita depois da mdat — o que um multiplexador faz por padrão, porque a tabela de amostras só fica completa depois do último quadro — um navegador transmitindo por HTTP precisa baixar o arquivo inteiro, ou disparar requisições de intervalo para caçar a moov, antes do primeiro quadro aparecer. Movê-la para a frente não muda nada da mídia: é um rearranjo puro, feito pelo ffmpeg com -movflags +faststart ou por qualquer ferramenta do tipo qt-faststart. Os deslocamentos de chunk dentro de stco ou co64 mudam todos quando a moov se move, e por isso é uma reescrita e não uma cópia.
- Por que a duração aparece como dois números divididos?
- Arquivos ISO base media guardam tempo em ticks, e cada cabeçalho carrega a própria escala dizendo quantos ticks formam um segundo. O cabeçalho do filme costuma usar 600 ou 1000; uma faixa de vídeo geralmente usa algo divisível pela taxa de quadros, como 15360 para 15 fps, e uma faixa de áudio quase sempre a própria taxa de amostragem, 44100 ou 48000. Uma duração de 44032 não significa nada sozinha: é um segundo de áudio a 44,1 kHz, ou 73 segundos num relógio de filme de 600 ticks. Mostrar a divisão e não só o resultado também torna o arredondamento visível: uma duração de faixa que não é um número inteiro de ticks do filme é o motivo usual de um arquivo relatar 5,98 segundos onde você esperava 6.
- A data de criação diz 1904 ou não definida. O arquivo está quebrado?
- Não. O ISO BMFF herdou a época do QuickTime, que começa à meia-noite UTC de 1º de janeiro de 1904, e muitíssimos multiplexadores simplesmente não preenchem esses campos: o ffmpeg escreve zero por padrão, e zero é a própria época. Ou seja, um arquivo que parece ter sido criado em 1904 foi na verdade criado por uma ferramenta que preferiu não dizer. Quando os campos estão preenchidos, vêm em UTC sem nenhuma informação de fuso, então a marca não diz onde a gravação foi feita, e é trivial de editar, de modo que sozinha não prova nada.
- Por que um arquivo fragmentado parece não ter amostras?
- Um MP4 fragmentado — o que DASH, HLS em fMP4 e toda gravação que precisa sobreviver a uma queda usam — mantém na moov apenas as definições de faixa, com uma caixa mvex avisando "virão fragmentos", e descreve as amostras reais em caixas moof espalhadas pelo arquivo, cada uma seguida da própria mdat. As tabelas de amostras da moov estão legitimamente vazias, e a duração do filme costuma ser zero porque não era conhecida quando o cabeçalho foi escrito; o total, se alguém o registrou, está em mvex/mehd. É também por isso que um arquivo fragmentado pode ser cortado em qualquer ponto e ainda tocar até o corte, e um MP4 progressivo comum não.
- MP4, M4A, M4V, MOV, 3GP: por que todos abrem aqui?
- São um formato só. A ISO/IEC 14496-12 define a estrutura de caixas, e a caixa ftyp no início declara uma marca principal e uma lista de marcas com as quais o arquivo é compatível. "M4A " quer dizer que o arquivo é só de áudio e de sabor Apple, "M4V" acrescenta as convenções de vídeo da Apple, "qt " é a disposição QuickTime original da qual todo o resto descende, "3gp4" é o perfil móvel, e "isom" ou "mp42" é a genérica que um player web procura. A extensão é uma dica para o sistema operacional; a lista de marcas é a declaração de verdade, e as duas divergem com frequência suficiente para que conferi-la seja a primeira coisa a fazer quando um arquivo não toca.
- Esta ferramenta consegue reparar um arquivo ou mudar a posição da moov?
- Não: ela apenas lê, e de propósito lê o mínimo possível. Os cabeçalhos das caixas são percorridos fatiando o arquivo, então a mdat nunca é carregada na memória e um filme enorme é inspecionado tão depressa quanto um pequeno. Nada é enviado e nada é reescrito. Se a árvore parar no meio com um erro sobre uma caixa que reivindica mais bytes do que o arquivo tem, normalmente o arquivo foi truncado na transferência ou o download foi interrompido; o que recupera isso é remultiplexar os fragmentos que sobraram, não editar o cabeçalho.
Ferramentas relacionadas
Inspetor de arquivos WebP
Percorra os blocos RIFF de um .webp no navegador: com perdas, sem perdas ou estendido, tela versus quadro, tempos de animação, alfa, ICC, Exif e XMP.
Inspetor de estrutura GIF
Abra um .gif e leia seus blocos: atraso e descarte de cada quadro, repetição, paletas, transparência e quantos bytes cada quadro realmente custa.
Inspetor de modelos STL (volume, impressão 3D)
Solte um .stl e veja contagem de triângulos, bounding box, tamanho, volume, área, verificação de estanqueidade e se cabe nas mesas de impressoras 3D.
Visualizador de Árvore de Pastas
Cole uma lista indentada de nomes de arquivos e pastas e obtenha uma árvore ASCII bonita — do tipo que você cola num README.
Formatador de Duração
Converta uma duração entre humano ("1h 30m"), relógio (1:30:00), ISO 8601 (PT1H30M) e segundos/minutos/horas/dias.
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.