Me gustaría generar una vista previa de gif para mi aplicación y realizarla en mi servidor usando FFMPEG.
Debería generar un gif obteniendo 10 cuadros para cada video pero sin usar un directorio temporal (o archivos temporales relacionados con cada cuadro) si es posible.
Con respecto a esta respuesta ensuperusuario.com, debería generar un gif usando cada cuadro, esto no es lo que necesito.
Parece extraño, pero el efecto que necesito es algo que puedes ver en muchos sitios web pornográficos (no recuerdo cuál de estos).
Respuesta1
Si te entiendo correctamente,este artículo en la Wiki de FFmpeg llamado "Crear una imagen en miniatura cada X segundos del video"muestra que FFmpeg no puede hacer lo que usted quiere (sin algunos cálculos automatizados).
La wiki dice que esa -vf "fps=fps=XYZ"
es tu mejor opción: creará una miniatura/fotograma por cada XYZ
fotograma del vídeo original. Si realmente desea 10 imágenes por video y todas tienen diferentes duraciones, primero puede leer el recuento total de fotogramas y luego calcular los fps necesarios con un script:
XYZ=wanted_frames_times_actual_fps/total_frames_of_vid
siendo wanted_frames_times_actual_fps
, por ejemplo, 10*25
(PAL) o 10*30
(NTSC) en su caso y total_frames_of_vid=(hh*3600+mm*60+ss)*25+ff
, donde hh
significa horas, mm
minutos, ss
segundos y ff
fotogramas (después del último segundo contado).Ejemplo de cálculo: un código de tiempo de 01:35:45:24
(o 01:35:45.960
en términos de FFmpeg, ya que FFmpeg no usa fotogramas sino milisegundos) a 25 fotogramas por segundo se asemeja a 143649 fotogramas en total.
Esta solución bien podría funcionar: solo necesita encontrar una manera de obtener el tiempo total del video (por ejemplo, a través de ffprobe) y sus fps (si no puede obtener un código de tiempo adecuado) y luego almacenar esa información como una variable llamada $total_frames_of_vid
.
Encontré otro enfoque sobre esto en la sección "Ver también" de Wiki, que enlaza a una pregunta de superusuario llamada "Miniaturas significativas para un vídeo usando FFmpeg"lo que sugiere usar:
ffmpeg -hide_banner -i <YOUR_VIDEO> -vf "select=gt(scene\,0.8)" -frames:v 10 -vsync vfr -vf "fps=fps=1/200" -y out%03d.png
(Modifiqué un poco el código: cambié el códec de imagen a PNG y cambié los valores de -frames:v
y fps
. También cambié las imágenes de salida para que tuvieran tres dígitos en sus nombres).
y luego volver a codificarlos en su GIF.
Esta solución también necesita algo de cálculo o trabajo manual, ya que los valores de todas las opciones (y especialmente fps
deben cambiarse según la duración del video). Es decir, probé el código original del superusuario con un video de 35 minutos y solo obtuve 5 fotogramas. .