FFmpeg suelta fotogramas al codificar una secuencia de imagen png en un video x264 mp4

16

Estoy tratando de codificar una imagen de secuencia ( frame0001.png, frame0002.png, ..., frame0160.png) en un vídeo x264 con el siguiente comando:

ffmpeg -i frame%04d.png -sameq -r 24 out.mp4

Después de la codificación, dice drop=5y de hecho hay "saltos" notables en el video.

Parece que alguien más tuvo un problema similar, pero para mí la respuesta aceptada no es muy útil ya que me gustaría que no se eliminen los marcos.

¿Falta un interruptor del comando? ¿O estoy haciendo algo más mal?


Editar: Salida de consola agregada:

ffmpeg version N-42347-g299387e Copyright (c) 2000-2012 the FFmpeg developers
  built on Jul  8 2012 15:46:39 with gcc 4.7.1
  configuration: --disable-static --enable-shared --enable-gpl --enable-version3
 --disable-w32threads --enable-runtime-cpudetect --enable-avisynth --enable-bzli
b --enable-frei0r --enable-libass --enable-libcelt --enable-libopencore-amrnb --
enable-libopencore-amrwb --enable-libfreetype --enable-libgsm --enable-libmp3lam
e --enable-libnut --enable-libopenjpeg --enable-librtmp --enable-libschroedinger
 --enable-libspeex --enable-libtheora --enable-libutvideo --enable-libvo-aacenc
--enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libx264 --en
able-libxavs --enable-libxvid --enable-zlib
  libavutil      51. 64.100 / 51. 64.100
  libavcodec     54. 33.100 / 54. 33.100
  libavformat    54. 15.102 / 54. 15.102
  libavdevice    54.  1.100 / 54.  1.100
  libavfilter     3.  1.100 /  3.  1.100
  libswscale      2.  1.100 /  2.  1.100
  libswresample   0. 15.100 /  0. 15.100
  libpostproc    52.  0.100 / 52.  0.100
Input #0, image2, from 'frame%04d.png':
  Duration: 00:00:06.40, start: 0.000000, bitrate: N/A
    Stream #0:0: Video: png, rgb24, 1920x1080, 25 fps, 25 tbr, 25 tbn, 25 tbc
[graph 0 input from stream 0:0 @ 01cd1f60] w:1920 h:1080 pixfmt:rgb24 tb:1/25 fr
:25/1 sar:0/1 sws_param:flags=2
[output stream 0:0 @ 01cd2220] No opaque field provided
[auto-inserted scaler 0 @ 01cd3540] w:1920 h:1080 fmt:rgb24 sar:0/1 -> w:1920 h:
1080 fmt:yuv420p sar:0/1 flags:0x4
[libx264 @ 01cd0dc0] using cpu capabilities: MMX2 SSE2Fast SSSE3 Cache64
[libx264 @ 01cd0dc0] profile High, level 4.0
[libx264 @ 01cd0dc0] 264 - core 125 r2200 999b753 - H.264/MPEG-4 AVC codec - Cop
yleft 2003-2012 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deb
lock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 m
e_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chro
ma_qp_offset=-2 threads=6 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 i
nterlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1
b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=24 scenec
ut=40 intra_refresh=0 rc_lookahead=40 rc=crf mbtree=1 crf=23.0 qcomp=0.60 qpmin=
0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00
Output #0, mp4, to 'out.mp4':
  Metadata:
    encoder         : Lavf54.15.102
    Stream #0:0: Video: h264 ([33][0][0][0] / 0x0021), yuv420p, 1920x1080, q=-1-
-1, 24 tbn, 24 tbc
Stream mapping:
  Stream #0:0 -> #0:0 (png -> libx264)
Press [q] to stop, [?] for help
frame=    8 fps=0.0 q=0.0 size=       0kB time=00:00:00.00 bitrate=   0.0kbits/s
frame=   15 fps= 15 q=0.0 size=       0kB time=00:00:00.00 bitrate=   0.0kbits/s
frame=   22 fps= 14 q=0.0 size=       0kB time=00:00:00.00 bitrate=   0.0kbits/s
frame=   29 fps= 14 q=0.0 size=       0kB time=00:00:00.00 bitrate=   0.0kbits/s
frame=   36 fps= 14 q=0.0 size=       0kB time=00:00:00.00 bitrate=   0.0kbits/s
frame=   43 fps= 14 q=0.0 size=       0kB time=00:00:00.00 bitrate=   0.0kbits/s
frame=   47 fps= 11 q=0.0 size=       0kB time=00:00:00.00 bitrate=   0.0kbits/s
frame=   53 fps= 11 q=28.0 size=     111kB time=00:00:00.04 bitrate=21735.2kbits
frame=   59 fps= 11 q=28.0 size=     268kB time=00:00:00.29 bitrate=7527.8kbits/
frame=   63 fps= 10 q=28.0 size=     375kB time=00:00:00.45 bitrate=6708.1kbits/
frame=   69 fps= 10 q=28.0 size=     538kB time=00:00:00.70 bitrate=6219.6kbits/
frame=   74 fps= 10 q=28.0 size=     675kB time=00:00:00.91 bitrate=6032.7kbits/
frame=   79 fps= 10 q=28.0 size=     802kB time=00:00:01.12 bitrate=5840.7kbits/
frame=   84 fps= 10 q=28.0 size=     922kB time=00:00:01.33 bitrate=5662.9kbits/
frame=   89 fps=9.9 q=28.0 size=    1060kB time=00:00:01.54 bitrate=5633.3kbits/
frame=   94 fps=9.9 q=28.0 size=    1186kB time=00:00:01.75 bitrate=5551.2kbits/
frame=   98 fps=9.7 q=28.0 size=    1309kB time=00:00:01.91 bitrate=5594.3kbits/
frame=  103 fps=9.7 q=28.0 size=    1436kB time=00:00:02.12 bitrate=5536.4kbits/
frame=  107 fps=9.6 q=28.0 size=    1533kB time=00:00:02.29 bitrate=5481.7kbits/
frame=  112 fps=9.5 q=28.0 size=    1654kB time=00:00:02.50 bitrate=5421.3kbits/
frame=  117 fps=9.4 q=28.0 size=    1781kB time=00:00:02.70 bitrate=5386.9kbits/
frame=  123 fps=9.4 q=28.0 size=    1925kB time=00:00:02.95 bitrate=5331.5kbits/
frame=  128 fps=9.4 q=28.0 size=    2030kB time=00:00:03.16 bitrate=5250.8kbits/
frame=  133 fps=9.4 q=28.0 size=    2210kB time=00:00:03.37 bitrate=5363.8kbits/
frame=  138 fps=9.3 q=28.0 size=    2356kB time=00:00:03.58 bitrate=5386.0kbits/
frame=  142 fps=9.3 q=28.0 size=    2465kB time=00:00:03.75 bitrate=5384.3kbits/
frame=  147 fps=9.3 q=28.0 size=    2602kB time=00:00:03.95 bitrate=5385.0kbits/
frame=  151 fps=9.2 q=28.0 size=    2706kB time=00:00:04.12 bitrate=5374.3kbits/
frame=  155 fps=9.2 q=28.0 size=    2812kB time=00:00:04.29 bitrate=5367.7kbits/
frame=  155 fps=7.0 q=28.0 Lsize=    4129kB time=00:00:06.37 bitrate=5306.4kbits
/s dup=0 drop=5
video:4128kB audio:0kB subtitle:0 global headers:0kB muxing overhead 0.035320%
[libx264 @ 01cd0dc0] frame I:2     Avg QP:21.97  size: 79850
[libx264 @ 01cd0dc0] frame P:153   Avg QP:23.43  size: 26579
[libx264 @ 01cd0dc0] mb I  I16..4:  9.6% 70.5% 19.9%
[libx264 @ 01cd0dc0] mb P  I16..4:  7.0% 15.3%  0.7%  P16..4: 45.2%  9.1%  2.2%
 0.0%  0.0%    skip:20.5%
[libx264 @ 01cd0dc0] 8x8 transform intra:66.7% inter:85.7%
[libx264 @ 01cd0dc0] coded y,uvDC,uvAC intra: 38.6% 58.0% 6.0% inter: 16.2% 27.2
% 0.2%
[libx264 @ 01cd0dc0] i16 v,h,dc,p: 35% 29% 17% 19%
[libx264 @ 01cd0dc0] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 26% 21% 31%  3%  4%  5%  4%
 4%  3%
[libx264 @ 01cd0dc0] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 29% 19% 13%  5%  8%  9%  7%
 6%  4%
[libx264 @ 01cd0dc0] i8c dc,h,v,p: 49% 23% 23%  5%
[libx264 @ 01cd0dc0] Weighted P-Frames: Y:0.0% UV:0.0%
[libx264 @ 01cd0dc0] ref P L0: 84.5% 10.9%  3.5%  1.1%
[libx264 @ 01cd0dc0] kb/s:5235.14
PtrFdr
fuente
Este sitio tiene información sobre cómo hacer una película usando imágenes secuenciales. Además, como comentario sobre esta pregunta , sameqno es una opción que deba usarse
SeanC
El enlace que publicaste realmente no dice nada específico, y el comando del OP debería funcionar en teoría. Solo falta información de la pregunta para poder responderla correctamente. Sin sameqembargo, tienes toda la razón .
slhck

Respuestas:

24

Problema resuelto.

Al observar la salida de la consola, parece que la velocidad de fotogramas predeterminada de la secuencia de entrada es de 25 fps:

Input #0, image2, from 'frame%04d.png':
  Duration: 00:00:06.40, start: 0.000000, bitrate: N/A
    Stream #0:0: Video: png, rgb24, 1920x1080, 25 fps, 25 tbr, 25 tbn, 25 tbc

De la documentación :

Para forzar la velocidad de fotogramas del archivo de entrada (válido solo para formatos sin formato) a 1 fps y la velocidad de fotogramas del archivo de salida a 24 fps:

ffmpeg -r 1 -i input.m2v -r 24 output.avi

Entonces, todo lo que necesitaba hacer para agregar otro -r 24:

ffmpeg-r 24-i frame%04d.png -r 24 out.mp4

PtrFdr
fuente
3
Me estaba arrancando el pelo tratando de codificar una secuencia de imágenes a 24 fps, porque incluso con la bandera -r 24 antes de la bandera -i todavía informa que la secuencia de entrada tiene 25 tbr, 25 tbn, 25 tbc (ffmpeg speak para velocidad de fotogramas de 25 fps). Pero en realidad está interpretando la transmisión como 24 fps, sin perder cuadros.
stib
8

Otra causa de la caída de cuadros es .png's cuyo formato varía. Por ejemplo, los .png creados a partir del convertcomando de ImageMagick son normalmente "color RGB", pero los que tienen menos de 256 colores se optimizan silenciosamente en "mapa de colores" o paleta, para reducir el tamaño del archivo. Cuando ffmpeg encuentra un cambio de uno a otro, comienza a soltar cuadros:

Input stream #0:0 frame changed from size:1280x720 fmt:rgb24 to size:1280x720 fmt:pal8
Input stream #0:0 frame changed from size:1280x720 fmt:pal8 to size:1280x720 fmt:rgb24

Para evitar que se caiga tales tramas, convert -define png:color-type=2.

Camille Goudeseune
fuente
No entiendo este comportamiento. No se eliminaron fotogramas con tres cambios de contexto (solo formato de píxel).
Gyan
Tal vez ffmpeg solucionó este problema en algún momento de los últimos dos años. (¿Qué fmt:dice tu ffmpeg que está leyendo?)
Camille Goudeseune
El mismo cambio: de RGB24 a PAL8 y viceversa.
Gyan
@CamilleGoudeseune Gracias por la respuesta, sin embargo, solucioné el problema. Fue un problema de concatenación debido a un formato / resolución de imagen diferente.
Asesino
2

La otra respuesta es incorrecta, el comando correcto es:

ffmpeg -framerate 24 -i frame% 04d.png out.mp4

La opción -framerate es específica de la entrada de 'secuencia de imagen' de image2, que especifica la velocidad de fotogramas nativa de la secuencia de imagen. Ver: https://www.ffmpeg.org/ffmpeg-formats.html#image2-1

Acru
fuente