2010-04-27 10:05:36 +0000 2010-04-27 10:05:36 +0000
72
72

¿Cómo extraer un fotograma de un vídeo cada N segundos a una imagen?

¿Cómo puedo convertir un archivo de vídeo en una secuencia de imágenes, por ejemplo un fotograma cada N segundos. ¿Puede mplayer o ffmpeg hacer esto? He utilizado MPlayer para hacer capturas de pantalla manualmente, pero me gustaría automatizar esto para un vídeo largo.

Respuestas (8)

73
73
73
2014-03-15 09:47:20 +0000

Es muy sencillo con ffmpeg, y puede dar salida a un fotograma cada N segundos sin scripting extra. Para exportar como una secuencia de imágenes sólo tiene que usar myimage_%04d.png o algo similar como salida. El bit %0xd se convierte en un número entero de x dígitos de longitud - el ejemplo que di obtiene una salida como

  • myimage_0000.png,
  • myimage_0001.png,
  • myimage_0002.png

Puede usar muchos formatos de imágenes fijas, png, jpeg, tga, lo que sea (vea ffmpeg -formats para una lista completa).

Así que ahora sabemos cómo exportar la película como una secuencia de imágenes, pero digamos que no queremos exportar cada uno de los fotogramas?

El truco es simplemente cambiar la velocidad de los fotogramas de la salida a lo que queramos usando la opción -r n donde n es el número de fotogramas por segundo. Un fotograma por segundo sería -r 1, un fotograma cada cuatro segundos sería -r 0.25, un fotograma cada diez segundos sería -r 0.1 y así sucesivamente.

Así que para ponerlo todo junto, así es como se vería guardar un cuadro de input.mov cada cuatro segundos a output_0000.png, output_0001.png etc.:

ffmpeg -i input.mov -r 0.25 output_%04d.png

Observe que la opción -r 0.25 va después de la parte -i input.mov, porque está controlando la velocidad de cuadros de la salida. Si la pones antes de la entrada trataría el archivo de entrada como si tuviera la velocidad de fotogramas especificada.

Cambia el %xd por el número de dígitos que necesites, por ejemplo, si el comando va a crear más de 10.000 fotogramas cambia el %04d por %05d. Esto también funciona para los archivos de entrada que son secuencia de imágenes. Leer más aquí.

Usuarios de Windows : En la línea de comandos use %

ejemplo: ffmpeg -i inputFile.mp4 -r 1 outputFile_%02d.png

En los scripts CMD y BAT use %%

ejemplo: ffmpeg -i inputFile.mp4 -r 1 outputFile %%02d.png

Así que doble %% en los scripts, y simple % en la línea de comandos interactiva. Si se equivoca en cualquiera de las dos situaciones, se generará un error.

28
28
28
2010-04-28 10:08:07 +0000
mplayer -vo jpeg -sstep 5 file.avi

guardará un fotograma como archivo jpeg cada 5 segundos.

Sin embargo, no se detendrá al final del archivo, sino que seguirá produciendo copias del último fotograma. Para evitar esto, encuentre la duración del video en segundos, usando otro reproductor, o con mplayer:

mplayer -vo null -ao null -frames 0 -identify file.avi

y busque una línea como “ID_LENGTH=147.00”.

Resta 2 a la duración, y utiliza este valor para la opción -endpos. Por ejemplo, para un vídeo de 147 segundos:

mplayer -vo jpeg -sstep 5 -endpos 145 file.avi
11
11
11
2010-04-27 11:41:07 +0000

Con ffmpeg , puede hacer lo siguiente:

ffmpeg -ss 4 -i input.avi -s 320x240 -frames:v 1 output.jpg

Este comando genera una miniatura JPG de tamaño 320×240 en el cuarto segundo del vídeo. Pon esto en un script que cambie la hora y el nombre del archivo y ya está.

Más información: Crear una imagen en miniatura cada X segundos del vídeo

8
8
8
2013-06-04 08:15:55 +0000

Si buscas una especie de hoja de contacto y si trabajas con un SO tipo Unix, puedes usar este elaborado script, llamado al punto Hoja de contacto de vídeo *NIX , abreviado vcs .

En el fondo también utiliza ffmpeg (por defecto) o mplayer, por lo que puede manejar muchos formatos de vídeo. Automatiza el proceso de captura de imágenes fijas de la película y las compone en una imagen con algún encabezado y pie de página. Puedes elegir, por ejemplo, cuántas capturas quieres o, alternativamente, las diferencias de tiempo entre ellas.

Para un intervalo de 10 minutos, la invocación es así:

vcs -i 10m input.avi

Compruebe la lista completa de opciones de la línea de comandos para algunos otros ajustes.

Aquí hay un ejemplo de hoja de contactos, tomada de la página principal :

7
7
7
2012-09-11 03:17:14 +0000

Con VLC 1.1.0 y superior, puedes utilizar el filtro de vídeo de escena:

vlc C:\video\to\process.mp4 --rate=1 --video-filter=scene --vout=dummy --start-time=10 --stop-time=11 --scene-format=png --scene-ratio=24 --scene-prefix=snap --scene-path=C:\path\for\snapshots\ vlc://quit

Lo anterior guarda 1 de cada 24 fotogramas (–scene-ratio=24), comenzando en 00:00:10 y terminando en 00:00:11.

Acabo de probar y confirmar que esto funciona con VLC 2.0.3 en una instalación fresca de Windows 8 (no tengo plugins o software de vídeo adicionales).

Documentación completa: http://wiki.videolan.org/Howtocreate_thumbnails

2
2
2
2010-04-27 10:13:07 +0000

VirtualDub puede hacer esto por usted

File -> Export -> Image sequence

1
1
1
2010-04-27 16:22:46 +0000

También puede probar esto

desde la línea de comandos de VLC…

vlc “C:\YOUR\file\path\file.avi” -V image –image-out-prefix=capname –image-out-ratio=60

file. avi es el video que quieres capturar, capname es el prefijo de las imágenes guardadas, puedes jugar con el ratio (60 significa que 1 de cada 60 imágenes es capturada) Puedes añadir más comandos, por ejemplo –image-out-format jpeg guardará tus caps como jpegs en lugar de pngs, –snapshot-path te permite elegir dónde guardar tus caps. Fuente de lo anterior

1
1
1
2011-11-30 22:06:24 +0000

Puedes saltarte fotogramas en VirtualDub. Sólo tiene que utilizar la opción “Decimar por” que se encuentra en el menú Video -> Frame Rate. Por ejemplo, si establece “Decimar por 100” y luego utiliza Archivo -> Exportar -> Secuencia de imágenes, se guardará sólo cada 100 fotogramas.