La tarea y por qué es más complicada de lo que parece?
"Dame un fotograma por segundo de este clip" es una de las tareas de vídeo más comunes que existen. Un evaluador de control de calidad necesita capturas de pantalla espaciadas uniformemente para adjuntarlas a un informe de error. Un investigador necesita una secuencia de imágenes muestreada para incorporarla a una herramienta de anotación. Un editor social necesita veinte fotografías candidatas de un corte de dos minutos sin tener que borrar la línea de tiempo a mano.
La tarea en sí es simple. Lo que lo hace complicado es que "un fotograma por segundo" es ambiguo en el momento en que se mira de cerca. ¿Te refieres a un fotograma por cada segundo de tiempo de reproducción, o cada Nésimo fotograma de la secuencia codificada? Esas son cosas diferentes: un clip de 24 fps y un clip de 60 fps producen el mismo conteo en la primera lectura y conteos tremendamente diferentes en la segunda. Elija el incorrecto y obtendrá una carpeta con casi duplicados o una secuencia demasiado escasa para ser útil.
Ambos enfoques a continuación producen píxeles idénticos. Se diferencian en cómo expresas lo que quieres y en la rapidez con la que descubres que lo expresaste mal.
Método 1: FFmpeg, parámetro por parámetro
El comando canónico es breve:
ffmpeg -i input.mp4 -vf fps=1 -q:v 2 frame_%04d.jpg
Cada parte importa:
-i input.mp4: el archivo fuente. FFmpeg lo lee una vez, de principio a fin; no busca cada marca de tiempo individualmente.-vf fps=1—el filtro de video que hace el trabajo real.fps=1significa un fotograma de salida por segundo de tiempo de reproducción, independientemente de la velocidad de fotogramas de origen. usofps=1/5para un fotograma cada cinco segundos, ofps=2para dos por segundo. Esta es la lectura del tiempo de reproducción.-q:v 2— Calidad JPEG, en una escala invertida donde 2 es casi sin pérdidas y 31 está muy comprimido. Omítalo y obtendrás el valor predeterminado de FFmpeg, que es notablemente más suave de lo que la mayoría de la gente espera. Si desea una salida sin pérdidas, escribaframe_%04d.pngen su lugar y suelte esta bandera por completo.frame_%04d.jpg— el patrón de salida.%04drellena con ceros el contador hasta cuatro dígitos:frame_0001.jpg,frame_0002.jpg. El acolchado no es cosmético; vea el problema de numeración a continuación.
Si desea la otra lectura (cada Nésimo fotograma codificado en lugar de cada N segundos: el filtro cambia:
ffmpeg -i input.mp4 -vf "select=not(mod(n\,10))" -vsync vfr frame_%04d.png
Esto mantiene los fotogramas donde el índice de fotogramas n es divisible por 10 y -vsync vfr impide que FFmpeg duplique fotogramas para completar una velocidad de salida constante. Deje esa marca apagada y obtendrá muchos más archivos de los que solicitó, lo cual es un primer resultado común y confuso.
Para limitar el trabajo a un segmento, ponga -ss antes -i de modo que FFmpeg busca antes de decodificar en lugar de decodificar y descartar:
ffmpeg -ss 00:01:30 -to 00:02:15 -i input.mp4 -vf fps=1 frame_%04d.png
Método 2: el mismo trabajo en un navegador
El extractor de fotogramas en este sitio se asigna a las mismas dos lecturas, con la ambigüedad explícita en la interfaz en lugar de oculta en una cadena de filtro.
- Suelte el archivo. Se lee directamente desde el disco a la memoria del navegador; no hay carga, por lo que una fuente de 3 GB comienza a procesarse inmediatamente en lugar de después de una transferencia.
- Elija el método de extracción. "Intervalo de tiempo" es el equivalente a
fps=1/N: ingresas al espacio en segundos. "Frame Rate (FPS)" es el equivalente aselect/modfiltro: ingrese N para conservar cada Nésimo cuadro. - Lea la sugerencia de recuento de fotogramas antes de extraer. Esta es la parte que ahorra más tiempo. La interfaz muestra cuántas imágenes producirá su configuración actual antes cualquier cosa se ejecuta, por lo que el error de 4000 archivos se convierte en un número que ve en lugar de una carpeta que descubre.
- Establecer formato y calidad. PNG para sin pérdidas, JPG o WebP con el control deslizante de 10 a 100 % cuando el tamaño importa. La posición del control deslizante corresponde a lo que
-q:vcontroles, expresan la forma en que la mayoría de la gente piensa al respecto. - Recorta el rango si es necesario. El control deslizante de doble control es
-ss/-toequivalente, con las marcas de tiempo que se muestran a medida que arrastra. - Exportar. Los marcos aparecen en una cuadrícula de vista previa; haga clic en uno para guardarlo solo o tome el conjunto completo como un solo ZIP.
Regla general para elegir un intervalo: para una grabación de pantalla o de un hablante, captura 1 cuadro cada 2 a 5 segundos. cada cambio de estado significativo. Para deportes o cualquier cosa con movimiento rápido, de 2 a 5 fotogramas por segundo. Reserve "cada fotograma" para un análisis genuino con precisión de fotogramas: un minuto de 60 fps equivale a 3600 imágenes y varios gigabytes de PNG.
Tres problemas que realmente cuestan tiempo a las personas
1. El resultado son miles de fotogramas casi idénticos.
Casi siempre hay una confusión de unidades: quisiste decir "cada 10 fotogramas" y escribiste fps=10, lo que significa diez cuadros por segundo — en una fuente de 30 fps que tiene 3 veces más imágenes que la expectativa ingenua, no 3 veces menos.
Antes de ejecutar cualquier cosa, haz la aritmética. Modo de tiempo de reproducción: duration ÷ interval. Modo de índice de cuadros: duration × source_fps ÷ N. Un clip de 10 minutos a 30 fps en "cada décimo fotograma" es 600 × 30 ÷ 10 = 1800 imágenes. Si ese número le sorprende, ajuste antes de empezar y no después. En la herramienta del navegador, la misma figura aparece automáticamente debajo del campo de intervalo.
2. La extracción se detiene a mitad de un vídeo largo
Diferentes causas en cada lado, por lo que la solución también difiere.
Con FFmpeg, un bloqueo suele estar relacionado con el disco: miles de PNG aterrizan en un directorio y el sistema de archivos, no el decodificador, se convierte en el cuello de botella. Escriba en un directorio nuevo y vacío, prefiera JPG cuando no necesite pérdida y divida fuentes muy largas en segmentos con -ss/-to.
En el navegador, el límite es la RAM: cada fotograma extraído se mantiene en la memoria hasta que descargue el ZIP. Unos cientos de 4K PNG son varios gigabytes y se puede eliminar una pestaña. El patrón confiable es trabajar en partes: use el control deslizante de rango de tiempo para tomar de 0:00 a 2:00, descargue ese ZIP y luego mueva el rango a 2:00 a 4:00. Cerrar otras pestañas antes de un trabajo grande realmente ayuda, y JPG con una calidad del 85-90% reduce la presión de la memoria varias veces sin ninguna diferencia visible para la mayoría de los usos.
3. La numeración de cuadros rompe el orden de importación.
Este muerde después de que la exportación se ve bien. Herramientas que ordenan nombres de archivos como texto (y la mayoría lo hace) frame_10.png antes frame_2.png, porque "1" ordena antes de "2" carácter por carácter. Tu secuencia se reproduce codificada y no es obvio por qué.
La solución es relleno con ceros, lo suficientemente amplia para el recuento más grande. alguna vez producirás. Eso es lo que %04d es para; use %05d si es posible que superes los 9999 fotogramas. Las herramientas del navegador se rellenan automáticamente, que es la razón principal por la que su salida tiende a caer directamente en un importador de secuencia de imágenes sin cambiar el nombre.
Cuando FFmpeg sigue siendo la opción correcta
Muchas veces. Este no es un caso en el que el navegador gana en todos los ámbitos:
- Cualquier cosa escrita o programada. Un trabajo cron, un paso de CI, una canalización del lado del servidor: un navegador no puede participar en ellos en absoluto.
- Lotes en muchos archivos. Un bucle de shell de más de 200 clips es trivial en FFmpeg y tedioso en cualquier otro lugar.
- Códecs que el navegador no decodificará. ProRes, DNxHD, formatos de cámara sin formato, contenedores inusuales. Si el navegador no puede reproducirlo, no podrá extraerlo. FFmpeg maneja casi todo.
- Filtrado durante la extracción. Desentrelazado, escalado, conversión de espacio de color, recorte, detección de cambio de escena: todo disponible como filtros en la misma pasada.
- Reproducibilidad. Un comando en un README es exacto. "Establecer el control deslizante aproximadamente aquí" no lo es.
La herramienta de navegador es la mejor opción para trabajos puntuales, para cualquiera que no quiera instalar y mantener una cadena de herramientas para una tarea ocasional, cuando la fuente es lo suficientemente confidencial como para que solo importe el procesamiento local y cuando desea ver los fotogramas antes de comprometerse con la exportación. Esas son situaciones genuinamente diferentes, no una clasificación.
Referencia rápida
| Lo que quieres | FFmpeg | herramienta de navegador |
|---|---|---|
| Un fotograma por segundo | -vf fps=1 |
Intervalo de tiempo = 1 |
| Un fotograma cada 5 segundos | -vf fps=1/5 |
Intervalo de tiempo = 5 |
| Cada décimo cuadro codificado | -vf "select=not(mod(n\,10))" -vsync vfr |
Modo de velocidad de fotogramas, N = 10 |
| Sólo de 1:30 a 2:15 | -ss 00:01:30 -to 00:02:15 |
Control deslizante de rango de tiempo |
| Salida sin pérdidas | .png patrón de salida |
Formato = PNG |
| Archivos más pequeños | -q:v 5 con .jpg |
JPG + control deslizante de calidad |
| Ver el recuento antes de ejecutar | Calcular manualmente | Se muestra debajo del campo de intervalo |
| Vista previa antes de guardar | Abra la carpeta de salida | Cuadrícula de vista previa incorporada |
| Automatización / lote | Shell loop, cron, CI | No es posible |
| ProRes, DNxHD, sin formato | Compatible | Sólo lo que decodifica el navegador |
Cualquiera que sea la ruta que tome, la decisión del intervalo es lo primero y la herramienta lo segundo. Calcule cuántos fotogramas necesita realmente, confirme el recuento antes de comenzar y el resto es mecánico.