ffmpeg: Intentar tomar una miniatura fps=fps=1/60 funciona pero no fps/fps=1/600

ffmpeg: Intentar tomar una miniatura fps=fps=1/60 funciona pero no fps/fps=1/600

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 elfpsfiltro 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:vla salida a jpeg es una escala lineal de 2-31. Un valor más bajo es una calidad más alta.

  • -f image2no 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 elselectfiltro de vídeoen cambio, pero no es tan fácil de usar.

  • El uso -threads 1elimina el ff_frame_thread_encoder_init failederror, pero no el otro error.

  • Los mismos errores aparecen cuando se usa -ren lugar del fpsfiltro.

Actualizaré esta respuesta si descubro más (me quedé sin tiempo para hacer una investigación adecuada...).

información relacionada