
Estoy siguiendo este documento del sitio ffmpeg:
Esto creará una imagen en miniatura cada minuto, denominada img001.jpg, img002.jpg, img003.jpg, ... (%03d significa que el número ordinal de cada imagen en miniatura debe formatearse con 3 dígitos)
ffmpeg -i myvideo.avi -f image2 -vf fps=fps=1/60 img%03d.jpg
Esto creará una imagen en miniatura cada 10 minutos, denominada pulgar0001.bmp, pulgar0002.bmp, pulgar0003.bmp, ...
ffmpeg -i test.flv -f image2 -vf fps=fps=1/600 thumb%04d.bmp
Pero si uso las opciones 1/600 no funciona y da el siguiente error:
ffmpeg -i src/e0b4c83e7ab2ada44c2785d25b0d4a9d45fc0c66.3gp -f image2 -vf fps=fps=1/250 thumbs/images%d.jpg
ffmpeg version 1.0.3 Copyright (c) 2000-2012 the FFmpeg developers
built on Oct 13 2013 21:48:31 with gcc 4.4.7 (GCC) 20120313 (Red Hat 4.4.7-3)
configuration:
libavutil 51. 73.101 / 51. 73.101
libavcodec 54. 59.100 / 54. 59.100
libavformat 54. 29.104 / 54. 29.104
libavdevice 54. 2.101 / 54. 2.101
libavfilter 3. 17.100 / 3. 17.100
libswscale 2. 1.101 / 2. 1.101
libswresample 0. 15.100 / 0. 15.100
Guessed Channel Layout for Input Stream #0.1 : mono
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'src/e0b4c83e7ab2ada44c2785d25b0d4a9d45fc0c66.3gp':
Metadata:
major_brand : 3gp4
minor_version : 512
compatible_brands: isomiso23gp4
creation_time : 2013-11-27 14:02:52
Duration: 00:05:01.33, start: 0.000000, bitrate: 177 kb/s
Stream #0:0(und): Video: h263 (s263 / 0x33363273), yuv420p, 176x144 [SAR 12:11 DAR 4:3], 161 kb/s, 15 fps, 15 tbr, 15 tbn, 29.97 tbc
Metadata:
creation_time : 2013-11-27 14:06:48
handler_name : VideoHandler
Stream #0:1(und): Audio: amr_nb (samr / 0x726D6173), 8000 Hz, mono, flt, 12 kb/s
Metadata:
creation_time : 2013-11-27 14:06:48
handler_name : SoundHandler
[mjpeg @ 0x3621940] bitrate tolerance too small for bitrate
[mjpeg @ 0x363c1c0] ff_frame_thread_encoder_init failed
Output #0, image2, to 'thumbs/images%d.jpg':
Metadata:
major_brand : 3gp4
minor_version : 512
compatible_brands: isomiso23gp4
Stream #0:0(und): Video: mjpeg, yuvj420p, 176x144 [SAR 12:11 DAR 4:3], q=2-31, 200 kb/s, 90k tbn, 0k tbc
Metadata:
creation_time : 2013-11-27 14:06:48
handler_name : VideoHandler
Stream mapping:
Stream #0:0 -> #0:0 (h263 -> mjpeg)
Error while opening encoder for output stream #0:0 - maybe incorrect parameters such as bit_rate, rate, width or height
¿Por qué funciona 1/60 y no 1/600? ¿Como arreglarlo? Además, actualizar el servidor no es una opción.
Respuesta1
Todavía no sé por qué la configuración predeterminada para la salida jpg mientras uso elfps
filtro de vídeocon ciertos valores provoca los errores:
[mjpeg @ 0x3621940] bitrate tolerance too small for bitrate
[mjpeg @ 0x363c1c0] ff_frame_thread_encoder_init failed
Ejemplo
Una solución alternativa es utilizar la opción -qscale:v
(o el alias -q:v
):
ffmpeg -i input.mkv -vf fps=1/250 -qscale:v 2 output%d.jpg
Notas
El rango efectivo para
-qscale:v
la salida a jpeg es una escala lineal de 2-31. Un valor más bajo es una calidad más alta.-f image2
no es necesario.También puedes omitir el adicional
fps=
como se muestra en mi ejemplo.Otra solución es utilizar un formato de salida diferente, como png, pero es posible que esta no sea una solución aceptable para usted.
Otra posible solución es utilizar el
select
filtro de vídeoen cambio, pero no es tan fácil de usar.El uso
-threads 1
elimina elff_frame_thread_encoder_init failed
error, pero no el otro error.Los mismos errores aparecen cuando se usa
-r
en lugar delfps
filtro.
Actualizaré esta respuesta si descubro más (me quedé sin tiempo para hacer una investigación adecuada...).