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 -framerate
como 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 25
si 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 yuv420p
Se 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 -r
opció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.