A tarefa e por que ela é mais complicada do que parece?
“Dê-me um quadro por segundo deste clipe” é uma das tarefas de vídeo mais comuns que existem. Um testador de controle de qualidade precisa de capturas de tela com espaçamento uniforme para anexar a um relatório de bug. Um pesquisador precisa de uma sequência de imagens amostradas para alimentar uma ferramenta de anotação. Um editor social precisa de vinte fotos de candidatos em um corte de dois minutos, sem precisar limpar a linha do tempo manualmente.
A tarefa em si é simples. O que o torna complicado é que “um quadro por segundo” é ambíguo no momento em que você olha de perto. Você quer dizer um quadro para cada segundo de tempo de reprodução ou cada Nésimo quadro do fluxo codificado? São coisas diferentes: um clipe de 24 fps e um clipe de 60 fps produzem a mesma contagem na primeira leitura e contagens totalmente diferentes na segunda. Escolha o errado e você obterá uma pasta de quase duplicatas ou uma sequência muito esparsa para ser útil.
Ambas as abordagens abaixo produzem pixels idênticos. Eles diferem na maneira como você expressa o que deseja e na rapidez com que descobre que expressou isso de maneira errada.
Método 1: FFmpeg, parâmetro por parâmetro
O comando canônico é curto:
ffmpeg -i input.mp4 -vf fps=1 -q:v 2 frame_%04d.jpg
Cada parte disso importa:
-i input.mp4— o arquivo de origem. FFmpeg lê uma vez, do início ao fim; ele não busca cada registro de data e hora individualmente.-vf fps=1— o filtro de vídeo que faz o trabalho real.fps=1significa um quadro de saída por segundo de tempo de reprodução, independentemente da taxa de quadros de origem. Usarfps=1/5para um quadro a cada cinco segundos oufps=2para dois por segundo. Esta é a leitura do tempo de reprodução.-q:v 2— Qualidade JPEG, em uma escala invertida onde 2 é quase sem perdas e 31 é fortemente compactado. Omita-o e você obterá o padrão FFmpeg, que é visivelmente mais suave do que a maioria das pessoas espera. Se você quiser uma saída sem perdas, escrevaframe_%04d.pngem vez disso e descarte esse sinalizador completamente.frame_%04d.jpg— o padrão de saída.%04dzera o contador até quatro dígitos:frame_0001.jpg,frame_0002.jpg. O preenchimento não é cosmético; veja o problema de numeração abaixo.
Se você quiser a outra leitura - cada No quadro codificado em vez de cada N segundos — o filtro muda:
ffmpeg -i input.mp4 -vf "select=not(mod(n\,10))" -vsync vfr frame_%04d.png
Isso mantém os quadros onde o índice de quadros n é divisível por 10 e -vsync vfr impede que FFmpeg duplique quadros para preencher uma taxa de saída constante. Deixe esse sinalizador desativado e você obterá muito mais arquivos do que solicitou, o que é um primeiro resultado comum e confuso.
Para limitar o trabalho a um segmento, coloque -ss antes -i portanto, FFmpeg busca antes de decodificar, em vez de decodificar e descartar:
ffmpeg -ss 00:01:30 -to 00:02:15 -i input.mp4 -vf fps=1 frame_%04d.png
Método 2: o mesmo trabalho em um navegador
O extrator de quadros neste site mapeia para as mesmas duas leituras, com a ambigüidade explicitada na interface em vez de oculta em uma string de filtro.
- Solte o arquivo. Ele é lido diretamente do disco para a memória do navegador — não há upload, então uma fonte de 3 GB inicia o processamento imediatamente, e não após uma transferência.
- Escolha o método de extração. "Intervalo de tempo" é equivalente a
fps=1/N— você entra na lacuna em segundos. "Taxa de quadros (FPS)" é equivalente aselect/modfiltro — você insere N para manter cada Nº quadro. - Leia a dica de contagem de quadros antes de extrair. Esta é a parte que economiza mais tempo. A interface mostra quantas imagens suas configurações atuais irão produzir antes qualquer coisa funciona, então o erro de 4.000 arquivos se torna um número que você vê em vez de uma pasta que você descubra.
- Defina formato e qualidade. PNG para sem perdas, JPG ou WebP com o controle deslizante de 10–100% quando o tamanho importa. A posição do controle deslizante corresponde a
-q:vcontroles, expressos da maneira que a maioria das pessoas pensa sobre isso. - Corte o intervalo, se necessário. O controle deslizante de alça dupla é o
-ss/-toequivalente, com os carimbos de data e hora mostrados conforme você arrasta. - Exportar. Os quadros aparecem em uma grade de visualização; clique em um para salvá-lo sozinho ou considere todo o conjunto como um único ZIP.
Regra prática para escolher um intervalo: para um talk-head ou gravação de tela, 1 quadro a cada 2–5 segundos captura cada mudança de estado significativa. Para esportes ou qualquer coisa com movimento rápido, 2 a 5 quadros por segundo. Reserve "cada quadro" para uma análise genuína com precisão de quadros - um minuto de 60 fps equivale a 3.600 imagens e vários gigabytes de PNG.
Três problemas que realmente custam tempo às pessoas
1. A saída são milhares de quadros quase idênticos
Quase sempre uma confusão de unidades: você quis dizer "a cada 10 quadros" e escreveu fps=10, o que significa dez quadros por segundo — em uma fonte de 30 fps que produz 3× mais imagens do que a expectativa ingênua, e não 3× menos.
Antes de executar qualquer coisa, faça a aritmética. Modo de tempo de reprodução: duration ÷ interval. Modo de índice de quadros: duration × source_fps ÷ N. Um clipe de 10 minutos a 30 qps em "cada 10 quadros" tem 600 × 30 ÷ 10 = 1.800 imagens. Se esse número o surpreender, ajuste antes de começar e não depois. Na ferramenta do navegador, a mesma figura aparece automaticamente no campo de intervalo.
2. A extração para no meio de um longo vídeo
Causas diferentes de cada lado, portanto a solução também é diferente.
Com FFmpeg, uma parada geralmente está relacionada ao disco - milhares de PNGs chegam em um diretório e o sistema de arquivos, e não o decodificador, torna-se o gargalo. Escreva em um diretório novo e vazio, prefira JPG quando não precisar de sem perdas e divida fontes muito longas em segmentos com -ss/-to.
No navegador, o limite é RAM: cada quadro extraído é mantido na memória até você baixar o ZIP. Algumas centenas de 4K PNGs equivalem a vários gigabytes e uma guia pode ser eliminada por isso. O padrão confiável é trabalhar em partes - use o controle deslizante de intervalo de tempo para ir de 0h00 a 2h00, baixe esse ZIP e mova o intervalo para 2h00 a 4h00. Fechar outras guias antes de um trabalho grande realmente ajuda, e JPG com qualidade de 85 a 90% reduz a pressão da memória várias vezes, sem nenhuma diferença visível para a maioria dos usos.
3. A numeração dos quadros quebra a ordem de importação
Este morde após a exportação parecer bom. Ferramentas que classificam nomes de arquivos como texto — e a maioria o faz — ordenam frame_10.png antes frame_2.png, porque "1" é classificado antes de "2" caractere por caractere. Sua sequência é reproduzida embaralhada e não é óbvio o porquê.
A correção é o preenchimento com zeros, amplo o suficiente para a maior contagem que você já produziu. É isso que %04d é para; use %05d se você exceder 9.999 frames. As ferramentas do navegador são preenchidas automaticamente, que é a principal razão pela qual sua saída tende a cair diretamente em um importador de sequência de imagens sem renomear.
Quando FFmpeg ainda é a escolha certa
Muitas vezes. Este não é um caso em que o navegador vence em todos os aspectos:
- Qualquer coisa roteirizada ou programada. Um cron job, uma etapa de CI, um pipeline do lado do servidor – um navegador não pode participar disso de forma alguma.
- Lotes em muitos arquivos. Um shell loop com mais de 200 clipes é trivial no FFmpeg e tedioso em qualquer outro lugar.
- Codecs que o navegador não decodifica. ProRes, DNxHD, formatos de câmera raw, contêineres incomuns. Se o navegador não conseguir reproduzi-lo, ele não poderá extrair dele. FFmpeg lida com quase tudo.
- Filtragem durante a extração. Desentrelaçamento, dimensionamento, conversão de espaço de cores, corte, detecção de mudança de cena – tudo disponível como filtros na mesma passagem.
- Reprodutibilidade. Um comando em um README é exato. "Defina o controle deslizante para aqui" não é.
A ferramenta do navegador é mais adequada para trabalhos únicos, para quem não deseja instalar e manter um conjunto de ferramentas para uma tarefa ocasional, quando a fonte é confidencial o suficiente para que o processamento apenas local seja importante e quando você deseja examinar os frames antes de se comprometer com a exportação. Essas são situações genuinamente diferentes, não uma classificação.
Referência rápida
| O que você quer | FFmpeg | Ferramenta de navegador |
|---|---|---|
| Um quadro por segundo | -vf fps=1 |
Intervalo de tempo = 1 |
| Um quadro a cada 5 segundos | -vf fps=1/5 |
Intervalo de tempo = 5 |
| Cada 10º quadro codificado | -vf "select=not(mod(n\,10))" -vsync vfr |
Modo Taxa de quadros, N = 10 |
| Apenas 1:30 a 2:15 | -ss 00:01:30 -to 00:02:15 |
Controle deslizante de intervalo de tempo |
| Saída sem perdas | .png padrão de saída |
Formato = PNG |
| Arquivos menores | -q:v 5 com .jpg |
JPG + controle deslizante de qualidade |
| Veja a contagem antes de correr | Calcular manualmente | Mostrado no campo de intervalo |
| Visualizar antes de salvar | Abra a pasta de saída | Grade de visualização integrada |
| Automação/lote | Loop de shell, cron, CI | Não é possível |
| ProRes, DNxHD, bruto | Tarefa | Somente o que o navegador decodifica |
Qualquer rota que você tomar, a decisão do intervalo vem primeiro e a ferramenta depois. Calcule quantos quadros você realmente precisa, confirme a contagem antes de começar, e o resto é mecânico.