FFMPEG: convierte vídeo a vista previa de Gif animado obteniendo fotograma tras intervalo

FFMPEG: convierte vídeo a vista previa de Gif animado obteniendo fotograma tras intervalo

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 XYZfotograma 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 hhsignifica horas, mmminutos, sssegundos y fffotogramas (después del último segundo contado).Ejemplo de cálculo: un código de tiempo de 01:35:45:24(o 01:35:45.960en 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:vy 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 fpsdeben 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. .

información relacionada