¿Cómo recuperar fotogramas de un vídeo sin perder algunos de ellos?

¿Cómo recuperar fotogramas de un vídeo sin perder algunos de ellos?

Creé un archivo AVI a partir de 30 imágenes PNG, 15 fotogramas/segundo:

ffmpeg -i %02d.png -r 15 video.avi

Pero cuando intenté recuperar las imágenes del AVI:

ffmpeg -i src.avi %02d.png

¡Solo obtuve 19 imágenes, en lugar de 30! También probé estos dos:

ffmpeg -i src.avi -r 15 %02d.png
ffmpeg -r 15 -i src.avi %02d.png

ambos con el mismo resultado. No hace falta decir que faltan fotogramas (saltos del 4º al 6º, por ejemplo). ¿A qué se debe y cómo lo soluciono?

Salida para el primer comando ( ffmpeg -i %02d.png -r 15 video.avi):

ffmpeg version N-50314-gf6fff8e Copyright (c) 2000-2013 the FFmpeg developers
  built on Feb 25 2013 21:57:41 with gcc 4.7.2 (GCC)
  configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enable-libass --enable-libbluray --enable-libcaca --enable-libfreetype --enable-libgsm --enable-libilbc --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libschroedinger --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libxavs --enable-libxvid --enable-zlib
  libavutil      52. 17.103 / 52. 17.103
  libavcodec     54. 92.100 / 54. 92.100
  libavformat    54. 63.100 / 54. 63.100
  libavdevice    54.  3.103 / 54.  3.103
  libavfilter     3. 41.100 /  3. 41.100
  libswscale      2.  2.100 /  2.  2.100
  libswresample   0. 17.102 /  0. 17.102
  libpostproc    52.  2.100 / 52.  2.100
Input #0, image2, from '%02d.png':
  Duration: 00:00:01.20, start: 0.000000, bitrate: N/A
    Stream #0:0: Video: png, rgb24, 713x386 [SAR 3779:3779 DAR 713:386], 25 fps, 25 tbr, 25 tbn, 25 tbc
Output #0, avi, to 'video.avi':
  Metadata:
    ISFT            : Lavf54.63.100
    Stream #0:0: Video: mpeg4 (FMP4 / 0x34504D46), yuv420p, 713x386 [SAR 1:1 DAR 713:386], q=2-31, 200 kb/s, 15 tbn, 15 tbc
Stream mapping:
  Stream #0:0 -> #0:0 (png -> mpeg4)
Press [q] to stop, [?] for help
frame=   19 fps=0.0 q=2.0 Lsize=      46kB time=00:00:01.26 bitrate= 297.1kbits/s dup=0 drop=11    

video:40kB audio:0kB subtitle:0 global headers:0kB muxing overhead 15.248175%

Salida para el segundo comando ( ffmpeg -i video.avi %02d.png):

ffmpeg version N-50314-gf6fff8e Copyright (c) 2000-2013 the FFmpeg developers
  built on Feb 25 2013 21:57:41 with gcc 4.7.2 (GCC)
  configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enable-libass --enable-libbluray --enable-libcaca --enable-libfreetype --enable-libgsm --enable-libilbc --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libschroedinger --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libxavs --enable-libxvid --enable-zlib
  libavutil      52. 17.103 / 52. 17.103
  libavcodec     54. 92.100 / 54. 92.100
  libavformat    54. 63.100 / 54. 63.100
  libavdevice    54.  3.103 / 54.  3.103
  libavfilter     3. 41.100 /  3. 41.100
  libswscale      2.  2.100 /  2.  2.100
  libswresample   0. 17.102 /  0. 17.102
  libpostproc    52.  2.100 / 52.  2.100
Input #0, avi, from 'video.avi':
  Metadata:
    encoder         : Lavf54.63.100
  Duration: 00:00:01.27, start: 0.000000, bitrate: 297 kb/s
    Stream #0:0: Video: mpeg4 (Simple Profile) (FMP4 / 0x34504D46), yuv420p, 713x386 [SAR 1:1 DAR 713:386], 15 tbr, 15 tbn, 15 tbc
Output #0, image2, to '%02d.png':
  Metadata:
    encoder         : Lavf54.63.100
    Stream #0:0: Video: png, rgb24, 713x386 [SAR 1:1 DAR 713:386], q=2-31, 200 kb/s, 90k tbn, 15 tbc
Stream mapping:
  Stream #0:0 -> #0:0 (mpeg4 -> png)
Press [q] to stop, [?] for help
frame=   19 fps=0.0 q=0.0 Lsize=N/A time=00:00:01.26 bitrate=N/A    

video:129kB audio:0kB subtitle:0 global headers:0kB muxing overhead -100.016665%

Respuesta1

Misma velocidad de fotogramas para entrada y salida

Utilícelo -frameratecomo opción de entrada para establecer la velocidad de fotogramas para las entradas de imágenes. Ejemplo:

ffmpeg -framerate 15 -i %02d.png -pix_fmt yuv420p output.mp4

Se aplicará el valor predeterminado -framerate 25si omite esta opción. Si solo proporciona una velocidad de fotogramas de entrada, como se muestra en el ejemplo anterior, entonces ffmpeg heredará esa misma velocidad de fotogramas para la salida sin eliminar ni duplicar fotogramas.

-pix_fmt yuv420pSe recomienda agregarlo por compatibilidad al emitir video H.264.

Diferentes velocidades de fotogramas para entrada y salida

Si desea variar la velocidad de fotogramas de entrada y la velocidad de fotogramas de salida, agregue la -ropción de salida. Esto puede resultar útil si desea que la entrada tenga una velocidad de fotogramas baja, pero tenga una velocidad de fotogramas de salida más estándar para mayor compatibilidad:

ffmpeg -framerate 1 -i input_%03d.png -r 24 -pix_fmt youv420p output.mp4

El ejemplo anterior mostrará un cuadro de entrada por segundo, pero los cuadros de salida se duplicarán, por lo que la salida realmente se reproducirá a 24 cuadros por segundo.

información relacionada