Extraer "uno de cada 10 cuadros" en un video usando VLC o FFmpeg


12

Estoy tratando de extraer "exactamente 1 fotograma de cada 10" fotogramas de un video (es decir, extraer 1, dejar 9 y luego repetir) con fines científicos. El video es de 105 cuadros, 3.5 segundos, 29.97 fps (h.264, .mov, producido por Nikon D3100).

Lo he subido aquí .

VLC

El siguiente comando debería producir 10 cuadros, pero solo produce 6 imágenes. Intenté diferentes proporciones de escena y ninguno de ellos produce el número correcto de fotogramas (ni siquiera cerca de corregir).

vlc 1.mov --video-filter=scene --vout=dummy --scene-ratio=10 --scene-prefix=img- --scene-path=. vlc://quit

¿Podría alguien decirme cuál es el problema?

FFmpeg

FFmpeg no parece tener un comando exactamente para mi propósito. El siguiente comando extrae 3 cuadros de cada segundo, pero dado que el FPS no es exactamente 30 (más bien 2.97), eso no producirá resultados correctos para mí.

Además, incluso FFmpeg no proporciona el número correcto de fotogramas con incluso este comando. Para 3.5 segundos de video, espero 10 cuadros como máximo, ¡pero lo que obtengo son 12 cuadros!

ffmpeg -i 1.mov -y -an -sameq  -r 3 -f image2 -vcodec mjpeg %03d.jpg 

¿Cómo puedo lograr lo que quiero?


1
Por cierto -sameq, no hace lo que probablemente piensas que hace, y se ha eliminado de la versión actual (el verdadero ffmpeg es decir, no estoy seguro de si está en el ffmpeg falso de Ubuntu). Use qscale en su lugar.
stib

Respuestas:


21

Seleccione 1 cuadro de cada 10 cuadros

Puede usar el selectfiltro de video ffmpegpara hacer esto:

ffmpeg -i input.mov -vf "select=not(mod(n\,10))" -vsync vfr -q:v 2 img_%03d.jpg
  • Para la salida JPG puede variar la calidad con -q:v. El rango efectivo es de 2 (mejor calidad) a 31 (peor calidad). No necesita esta opción si desea exportar a PNG en su lugar.

  • Esta es la salida img_001.jpg, img_002.jpg, img_003.jpg, etc.


Parece muy interesante, pero parece requerir alguna versión particular o algo extra compilado. Obtengo " unrecognized option '-filter:v'" con "FFmpeg versión SVN-r0.5.1-4: 0.5.1-1ubuntu1.3" (--enable-avfilter --enable-avfilter-lavf --enable-vdpau --enable-bzlib --enable -libgsm --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-pthreads --enable-zlib --disable-stripping --disable-vhook --enable-runtime-cpudetect - -enable-gpl --enable-postproc --enable-swscale --enable-x11grab --enable-libdc1394 --enable-shared --disable-static)
mivk

Tampoco puedo ejecutar el comando y recibo el siguiente error en ffmpeg windows N-35709-g7d531e8: [select @ 017EBB00] [Eval @ 0022DC08] Falta ')' o demasiados argumentos en 'mod (n \, 10))' [ select @ 017EBB00] Error al analizar la expresión 'not (mod (n \, 10))' Error al inicializar el filtro 'select' con args 'not (mod (n \, 10))' ¡Error al abrir los filtros!
wmac

@mivk Su versión FFmpeg del repositorio de Ubuntu no tiene capacidades de filtrado. Tendrás que compilar FFmpeg .
llogan

1
@wmac Supongo que a Windows no le gustan las comillas simples. Cambiarlos para comillas dobles: ".
llogan

1
@ LordNeckbeard, gracias, funciona correctamente y resolvió todo el problema. Realmente aprecio mucho tu ayuda.
wmac

4

El aspecto más importante en su pregunta es el hecho de que el video usa 29.97 cuadros por segundo, no 30. Pesky NTSC.

De todos modos, creo que sería más fácil extraer cada fotograma y luego eliminar los que no necesita:

ffmpeg -i 1.mov -y -f image2 -c:v mjpeg %03d.jpg

Luego, elimine los que no necesita. Como cada décimo cuadro terminará con un 1.jpg, podemos tomar todos los demás ...

find . -maxdepth 1 -not -iname "*1.jpg"

... y una vez que esté seguro, estos son los que desea eliminar:

find . -maxdepth 1 -not -iname "*1.jpg" -exec rm '{}' \;

Si puede usar mencoder, puede probar la framestepopción, como se explica en la documentación , como framestep=10en su caso. Sin embargo, personalmente no pude instalarlo / probarlo.


1
Muchas gracias por tu ayuda y tu edición. Traté de mencoder e incluso ese tiene un problema! Supongo que tiene algo que ver con el códec o el contenedor. ffmpeg extrae exactamente 105 cuadros con el siguiente comando: ffmpeg -i 1.mov -y -an -sameq -f image2 -vcodec mjpeg% 03d.jpg pero mencoder solo extrae 90 cuadros !!! con el siguiente comando: mplayer -vo png 1.mov El uso de framestep = 10 también produce un número incorrecto de fotogramas. Estoy sorprendido de cómo los tres (ffmpeg, vlc y mencoder) no pueden hacer una tarea tan simple correctamente. Envié un informe de error al sitio web de VLC. Gracias de nuevo.
wmac

0

Si primero fuera a convertir el video a una serie de imágenes rgb24 o rgb32 sin procesar, entonces podría obtener la cantidad correcta de cuadros, ya que en su forma original parece incluir tipos de cuadros inusuales que pueden no ser imágenes. ?

En los Discos Láser originales, todo el video estaba compuesto por una serie de imágenes con números de fotogramas individuales del 1 al 100,000 o más, y esa es realmente la forma correcta de establecer una línea de base para futuras conversiones o manipulaciones.

La industria ha cambiado a esta extraña idea de compresión simplemente para reducir el dinero perdido y para corromper las verdaderas formas científicas de manejar números.

Primero debe extraer cualquier audio como un archivo wave para no perderlo por completo. Parece que FFMPEG pone información de identificación en cada imagen extraída, porque si intentas unir imágenes de las que acabas de extraer, y mezclas otras imágenes de otras fuentes con la misma extensión, ffmpeg ignorará las imágenes que intentaste dividir en el medio de todo. .

Con el formato de disco láser, la velocidad de fotogramas simplemente está dictada por la velocidad que presente las imágenes secuenciales y no se controla de ninguna manera por las imágenes mismas.

FFMPEG podría tomar una lección de la ciencia en lugar del arte para el manejo adecuado y la visualización de imágenes de cualquier tipo. O posiblemente toda la industria audiovisual en sí. La industria realmente necesita mejorar las capacidades del hardware y usar datos sin procesar que requieren mucha memoria / almacenamiento. Nada supera a los datos en bruto para precisión y exactitud.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.