FFmpeg puede capturar imágenes de videos que pueden usarse como miniaturas para representar el video. Las formas más comunes de hacerlo están capturadas en el FFmpeg Wiki .
Pero, no quiero elegir marcos aleatorios en algunos intervalos. Encontré algunas opciones usando filtros en FFmpeg para capturar cambios de escena:
El filtro thumbnail
intenta encontrar los cuadros más representativos en el video:
ffmpeg -i input.mp4 -vf "thumbnail,scale=640:360" -frames:v 1 thumb.png
y el siguiente comando selecciona solo los cuadros que tienen más del 40% de los cambios en comparación con los anteriores (y probablemente sean cambios de escena) y genera una secuencia de 5 PNG.
ffmpeg -i input.mp4 -vf "select=gt(scene\,0.4),scale=640:360" -frames:v 5 thumb%03d.png
Información de crédito para los comandos anteriores a Fabio Sonnati . El segundo parecía mejor, ya que podía obtener n imágenes y elegir el mejor. Lo probé y generó la misma imagen 5 veces.
Un poco más de investigación me llevó a:
ffmpeg -i input.mp4 -vf "select=gt(scene\,0.5)" -frames:v 5 -vsync vfr out%02d.png
-vsync vfr
asegura que obtengas imágenes diferentes. Esto siempre selecciona el primer fotograma del video, en la mayoría de los casos el primer fotograma es créditos / logotipo y no tiene sentido, así que agregué un -ss
3 para descartar los primeros 3 segundos del video.
Mi comando final se ve así:
ffmpeg -ss 3 -i input.mp4 -vf "select=gt(scene\,0.5)" -frames:v 5 -vsync vfr out%02d.jpg
Esto fue lo mejor que pude hacer. Me di cuenta de que, dado que elijo solo 5 videos, todos son en su mayoría desde el comienzo del video y pueden perderse escenas importantes que ocurren más adelante en el video
Me gustaría elegir tu cerebro para cualquier otra opción mejor.
mjpeg
codificador para mí, y también compruebo jpegoptim
y exiv2
, ambos funcionan bien para mí con todos los resultados JPG de sus comandos de ejemplo.
libopenjpeg
... no estoy seguro si eso hace la diferencia.