¿Cómo extraer todos los fotogramas clave de un videoclip?

10

Estoy tratando de extraer fotogramas clave de un videoclip. Intenté el siguiente comando, pero extrae todos los cuadros.

ffmpeg -vf select="eq(pict_type\,PICT_TYPE_I)" -i 2.flv -vsync 2 -s 73x41 -r 30 -f image2 thumbnails-%%02d.jpeg
Rashed Mustafa
fuente

Respuestas:

20

Puede simplificar este uso -skip_framesin la necesidad de un selectfiltro de video:

ffmpeg -skip_frame nokey -i 2.flv -vsync 0 -r 30 -f image2 thumbnails-%02d.jpeg
radoh
fuente
2
¡Increíble, toma menos de 10 segundos en un video de 20 minutos en comparación con más de 3 minutos con el filtro de selección!
loco
¡Asegúrese de usar -threads 1, en comparación con el valor predeterminado -threads auto, hace que un cropdetectgráfico de filtro ( ffmpeg -threads 1 -skip_frame nokey -i input.mkv -filter:v select='not(mod(n\,20))',cropdetect -an -f null /dev/null) sea 2 veces más rápido en mi sistema (de 60 a 30 segundos)!
genpfault
No usaría skip_frame nokey. ¿Ya has comprobado la salida? En mis archivos y compilación (agosto de 2019) obtengo marcas de tiempo inadecuadas, ya que en nokey me da el cuadro anterior antes del cuadro I, mientras que los cuadros no filtrados / todos muestran el cuadro I en un sello de tiempo posterior.
JasonXA
La razón por la que @genpfault sugiere usar -threads 1es que, de lo contrario, la secuencia de los fotogramas clave de salida puede emitirse fuera de orden. Si tiene algún tipo de forma post-hoc de tratar este problema, puede conservar múltiples subprocesos. Además, parece que todavía es posible obtener fotogramas clave fuera de orden, incluso cuando se usa -threads 1 , pero ahora en este caso, todas estas ocurrencias parecen estar acompañadas / marcadas por un error de decodificador h264 illegal short term buffer state detected.
Glenn Slayden
12

Ejemplo usando los filtros selecty scale:

ffmpeg -i 2.flv -vf "select=eq(pict_type\,I),scale=73x41" \
-vsync vfr -qscale:v 2 thumbnails-%02d.jpeg

Algunos consejos:

  • Los filtros no deben aparecer antes de la -iopción, ya que son una opción de salida. No sé de dónde sacaste exactamente el comando, pero PICT_TYPE_Ino existe, debería ser I.

  • En el scalefiltro puede reemplazar 73o 41hacer que el filtro calcule automáticamente el ancho o la altura para preservar la relación de aspecto: como scale=73:-1o scale=-1:41. Esto evita el estiramiento o el aplastamiento que puede resultar de una escala "forzada".

  • La calidad de salida se puede controlar con -qscale:v(o el alias -q:v). El rango efectivo es una escala lineal de 2 a 31 y un valor más bajo es una calidad más alta.

  • Que ffmpegpermite un filtro antes de que la entrada me diga que podría estar desactualizado. Descargue una compilación estática reciente para su sistema operativo, o compílelo usted mismo de acuerdo con las guías de compilación si lo anterior no funciona.

slhck
fuente
1
Si su objetivo es extraer los fotogramas clave sin pérdidas, puede intentar lo siguiente:ffmpeg -i 2.flv -vf "select=eq(pict_type\,I)" -vsync vfr frame-%02d.png
Peltier
0

si esto errores:

La opción vf (configurar filtros de video) no se puede aplicar a la url de entrada 1508.mp4: está intentando aplicar una opción de entrada a un archivo de salida o viceversa. Mueva esta opción antes del archivo al que pertenece. Error al analizar opciones para el archivo de entrada 1508.mp4. Error al abrir archivos de entrada: argumento no válido

Puedes hacerlo:

ffmpeg -i 263.mp4 -vf select=eq(pict_type\,PICT_TYPE_I)  -vsync 2 -s 480x320 -r 24 -f image2 thumbnails-%05d.jpeg

== --------------------------------------------

Parámetros "-i" por adelantado

Tom
fuente