Hacer miniatura del video

11

¿Cómo puedo hacer una captura simple de un video? Preferiblemente desde la línea de comando?

Idea: tome 9 instantáneas para 9 veces incluso colocadas (en la línea de tiempo) y guárdelas como JPG

Ejemplo:

Movie length = 10 min
T1= snapshot of 1 min
T2= snapshot of 2 min
......
T9= snapshot of 9 min
   |   |
 T1| T2| T3
---+---+---
 T4| T5| T6
---+---+---
 T7| T8| T9
   |   |

¿Cuál es el mejor programa para hacer esto? ¿Hay algún programa de código abierto?

Siga
fuente

Respuestas:

5

ffmpeg es una excelente herramienta de código abierto para manipular videos, incluida la extracción de fotogramas.

Para extraer un solo cuadro de una marca de tiempo específica, puede usar comandos como

ffmpeg -i video.avi -r 1  -t 00:01:00 -f image2 image%05d.png

-r es framerate. También puedes usar comandos como

ffmpeg -i video.avi -r 1/1440 -f image2 image%05d.png

para obtener un cuadro cada minuto (suponiendo video 24FPS). El% 05d significa que el número ordinal de cada imagen en miniatura debe formatearse con 5 dígitos.

Si desea combinar imágenes como montaje (su cuadrícula), puede usar imagemagick después de extraer marcos usando ffmpeg.

Olli
fuente
1

vcsi es una herramienta de línea de comandos escrita en Python que se puede usar para crear una cuadrícula de instantáneas de 3 por 3 con el siguiente comando:

vcsi -g 3x3 video.mkv -o output.jpg
zx228
fuente
0

Mi caso de uso es solo una miniatura de un video, solo un archivo para usar como <video>póster de etiqueta. Entonces, ¿cuál sería una forma rápida de hacer esto?

Con ffmpeg, puedes hacer esto:

ffmpeg -ss 123 -y -i video.mp4 -r 1 -updatefirst 1 -frames 1 poster.jpg

Eso le dará el marco cerca del segundo 123del video.mp4guardado como poster.jpg.

El problema, como puede ver, es que necesitamos saber qué segundo es el correcto.

Para mantener bajas nuestras dependencias, usaremos ffmpeg para esto:

# Get the time as h:m:s (non-padded)
l=$(ffmpeg -i video.mp4 2>&1 | grep Duration: | sed -r 's/\..*//;s/.*: //;s/0([0-9])/\1/g')
# Convert that into seconds
s=$((($(cut -f1 -d: <<< $l) * 60 + $(cut -f2 -d: <<< $l)) * 60 + $(cut -f3 -d: <<< $l)))
# Get frame at 25% as the thumbnail
ffmpeg -ss $((s / 4)) -y -i video.mp4 -r 1 -updatefirst 1 -frames 1 poster.jpg

El 25% del video parece una opción común, pero también puede hacerlo el 33% o el 50%.

Aquí hay un script que hace esto .

Camilo Martin
fuente