¿Cómo extraer 1 captura de pantalla para un video con ffmpeg en un momento dado?

109

Hay muchos tutoriales y cosas que muestran cómo extraer múltiples capturas de pantalla de un video usando ffmpeg. Establece -r e incluso puede comenzar una cierta cantidad.

Pero solo quiero 1 captura de pantalla a, digamos 01:23:45 pulg. O 1 captura de pantalla al 86% pulg.

Todo esto es posible con ffmpegthumbnailer, pero es otra dependencia de la que no quiero depender. Quiero poder hacerlo con ffmpeg.

Peter Bengtsson
fuente

Respuestas:

208

Utilice la -ssopción:

ffmpeg -ss 01:23:45 -i input -vframes 1 -q:v 2 output.jpg
  • Para salida JPEG, utilice -q:vpara controlar la calidad de salida. El rango completo es una escala lineal de 1 a 31 donde un valor más bajo da como resultado una calidad más alta. 2-5 es un buen rango para probar.

  • El filtro de selección proporciona un método alternativo para necesidades más complejas, como seleccionar solo ciertos tipos de marcos, o 1 por 100, etc.

  • Colocar -ssantes de la entrada será más rápido. Consulte FFmpeg Wiki: Seeking y este extracto de la ffmpegdocumentación de la herramienta cli :

-ss posición (entrada / salida)

Cuando se usa como una opción de entrada (antes -i), busca en este archivo de entrada la posición. Tenga en cuenta que en la mayoría de los formatos no es posible buscar exactamente, por ffmpeglo que buscará el punto de búsqueda más cercano antes de la posición. Cuando la transcodificación y -accurate_seekestá habilitada (por defecto), este segmento extra entre el punto de búsqueda y la posición será decodificado y descartado. Al hacer una copia de flujo o cuando -noaccurate_seekse usa, se conservará.

Cuando se usa como una opción de salida (antes de un nombre de archivo de salida), decodifica pero descarta la entrada hasta que las marcas de tiempo alcanzan su posición.

la posición puede ser en segundos o en hh:mm:ss[.xxx]forma.

llogan
fuente
2
Esto es MUCHO más rápido. Muchas gracias. Poner el -ss primero hace una gran diferencia.
Peter Bengtsson
¿Hay alguna forma de obtener el n-ésimo fotograma después del tiempo especificado?
Dorien
@GuntherPiez No veo ninguna mención en ninguna parte sobre posibles artefactos.
Stefan Reich
2
Tenga en cuenta que vframesestá obsoleto en (al menos) la versión 4.2.2. Según el manual, "[ vframes] es un alias obsoleto para ' -frames:v', que debería utilizar en su lugar".
Synexis
Funciona perfecto y rápido.
Smeterlink
37

FFMpeg puede hacer esto buscando la marca de tiempo dada y extrayendo exactamente un fotograma como imagen, ver por ejemplo:

ffmpeg -i input_file.mp4 -ss 01:23:45 -vframes 1 output.jpg

Expliquemos las opciones:

-i input file           the path to the input file
-ss 01:23:45            seek the position to the specified timestamp
-vframes 1              only handle one video frame
output.jpg              output filename, should have a well-known extension

El -ssparámetro acepta un valor en forma HH:MM:SS[.xxx]o como un número en segundos. Si necesita un porcentaje, debe calcular la duración del video de antemano.

SirDarius
fuente
Parece funcionar como se esperaba. Actualmente estoy evaluando si esta es la misma velocidad que con ffmpegthumbnailer.
Peter Bengtsson
Sí, este enfoque es muy lento. Ver peterbe.com/plog/fastest-way-to-take-screencaps-out-of-videos
Peter Bengtsson
7
intente usar la opción -ss antes de -i, ya que omitirá la parte de decodificación de la canalización. Esto podría acelerar el proceso.
SirDarius
1
¿Hay alguna forma de generar como PNG en la secuencia en lugar de un archivo?
Nicke Manarin
1
@NickeManarin Sí .. ffmpeg -ss 01:23:45 -i video.mp4 -c:v png -frames:v 1 image.jpg. Observe que también coloco la -ssopción "buscar" antes del archivo de entrada en la línea de comando, como otros han recomendado.
Glenn Slayden