Estoy intentando usar FFmpeg para extraer un fotograma por segundo de cada archivo en un directorio.
Utilizo este comando para archivos individuales, pero no sé cómo ingresar un directorio:
ffmpeg -i "C:\input\clip1.mp4" -vf fps=1 -qscale:v 2 "C:\output\clip1\clip1A"%d.jpg
Idealmente, quiero que los marcos se guarden en su propia carpeta como se muestra a continuación, peropensarPuedo resolver esa parte yo mismo. Está bien si todos se envían a la misma carpeta con el mismo prefijo y numeración secuencial.
C:\output\clip1\clip1-001.jpg
,clip1-002.jpg
C:\output\clip2\clip2-001.jpg
,clip2-002.jpg
Llevo muchas horas intentándolo y sigo completamente perdido. Cualquier ayuda sería muy apreciada.
Respuesta1
¡Hecho! Este código generará fotogramas en carpetas con el mismo nombre que el vídeo del que proceden. Los cuadros tendrán el prefijo del nombre del video y el sufijo de números secuenciales que comienzan en 001. Entonces, para mis archivos, aparece "/clip1/clip1-001.jpg", etc.
En caso de que seas como yo y no tengas idea de lo que estás haciendo, pega el siguiente código en el bloc de notas, guárdalo como "extractframesorwhatever.bat" y ejecútalo desde el directorio donde están tus clips.
for %%F in (*.mp4) do (
If not Exist "%%~nF" MkDir "%%~nF"
ffmpeg -i %%F -r 1 -qscale:v 2 %%~nF\%%~nF-%%3d.jpg
)
Si desea generar las carpetas en otro lugar, cambie:
If not Exist "%%~nF" MkDir "%%~nF"
A algo como esto:
If not Exist "C:\wherever\%%~nF" MkDir "C:\wherever\%%~nF"
Si haces eso, también necesitarás cambiar la salida de (en mi ejemplo):
%%~nF\%%~nF-%%3d.jpg
a
C:\wherever\%%~nF\%%~nF-%%3d.jpg
O si quieres todos los marcos en una carpeta. Reemplace el primer %%~nF de la salida con su directorio preferido. Usando mi ejemplo, iría de C:\wherever\%%~nF\%%~nF-%%3d.jpg a C:\wherever\frames\%%~nF-%%3d.jpg. También querrás editar la segunda línea para que apunte a la nueva ubicación y evitar que cree un montón de directorios innecesarios, o eliminar la segunda línea por completo. Si elimina la segunda línea, primero tendrá que crear la carpeta "marcos".
EDITAR: es posible que deba eliminar todos los espacios de los nombres de los archivos antes de poder procesarlos. La "utilidad de cambio de nombre masivo" puede ahorrarle mucho tiempo.
Respuesta2
Me gusta este método para extraer fotogramas, es muy útil. Pero cuando uso el código que proporcionas:
for %%F in (*.mp4) do (
If not Exist "%%~nF" MkDir "%%~nF"
ffmpeg -i %%F -r 1 -qscale:v 2 %%~nF\%%~nF-%%3d.jpg
)
Obtengo dos carpetas de salida:
Uno de los nombres del archivo (que es donde quiero que vayan mis imágenes) y una carpeta de prueba (que es donde van mis imágenes).
Sé que así es como se supone que funciona el código, pero tal vez los cambios en los últimos cuatro años hayan cambiado algo en la forma en que funciona este código ahora. Pero realmente, en definitiva, no es DEMASIADO inconveniente.
También agregaré, para aquellos que quieran hacer GIF de mayor calidad, pueden simplemente cambiar .jpg a .png.
Además, puedes hacer que esto funcione con cualquier formato de vídeo (o más, al menos, ya que no lo he probado mucho) cambiando el (.mp4) en (.mkv), que sé que funciona.
Supongo que todos los demás formatos de vídeo también funcionarían, como (.avi), (.mpeg), (.ts), (.flv), etc.-aunque esto no está probado.
Pero como soy igual que el OP en el sentido de que no entiendo este código, solo copio y pego lo que encuentro en línea y juego un poco con él, es útil tener los archivos .bat listos para usar.
Solo me gustaría saber cómo arreglar la carpeta de "prueba" que se está creando y hacer que las capturas de pantalla vayan a la carpeta que ya crea con el nombre del archivo.
Para mostrar cómo modifiqué el código para que funcione con otros formatos de video, incluiré un par de ejemplos:
El primer ejemplo, que sé que funciona, es para archivos .mkv en lugar de .mp4, convirtiendo las capturas de pantalla en .png.
for %%F in (*.mkv) do (
If not Exist "%%~nF" MkDir "%%~nF"
ffmpeg -i %%F -r 1 -qscale:v 2 %%~nF\%%~nF-%%3d.png
)
El último ejemplo DEBE funcionar para archivos .ts que convierten las capturas de pantalla en .png.
for %%F in (*.ts) do (
If not Exist "%%~nF" MkDir "%%~nF"
ffmpeg -i %%F -r 1 -qscale:v 2 %%~nF\%%~nF-%%3d.png
)