FFmpeg drops frames when encoding a png image sequence into an x264 mp4 video

26,964

Solution 1

Problem solved.

By looking at the console output, it seems that the default framerate of the input sequence is 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

From the documentation:

To force the frame rate of the input file (valid for raw formats only) to 1 fps and the frame rate of the output file to 24 fps:

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

So, all I needed to do just to add another -r 24:

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

Solution 2

Another cause of dropped frames is .png's whose format varies. For example, .png's created from ImageMagick's convert command are normally "color RGB", but ones with fewer than 256 colors are silently optimized into "colormap" or palette, to reduce file size. When ffmpeg encounters a change from one to the other, it starts dropping frames:

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

To avoid dropping such frames, convert -define png:color-type=2.

Solution 3

The other answer is wrong, the correct command is:

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

The -framerate option is specific to the image2 'image sequence' input, specifying the native frame rate of the image sequence. See: https://www.ffmpeg.org/ffmpeg-formats.html#image2-1

This option should be placed before the image sequence input, to apply to that input. Specifying the framerate this correct way also ensures certain video filters work as intended.

Share:
26,964

Related videos on Youtube

jem4789
Author by

jem4789

Updated on September 18, 2022

Comments

  • jem4789
    jem4789 over 1 year

    I'm trying to encode an image-sequence (frame0001.png, frame0002.png, ... , frame0160.png) into an x264 video using the following command:

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

    After encoding, it says drop=5 and indeed there are noticeable “jumps” in the video.

    It appears someone else had a similar problem, but for me the accepted answer isn't very useful since I'd like to have no frames dropped.

    Is a switch missing from the command? Or am I doing something else wrong?


    Edit: Added console output:

    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
    
    • SeanC
      SeanC almost 12 years
      This site has information on making a movie using sequential images Also, as a comment on this question, sameq is not an option that should be used
    • slhck
      slhck almost 12 years
      The link you posted doesn't really tell anything specific — and the OP's command should work in theory. There's just information missing from the question to be able to answer it properly. You're absolutely right about sameq though.
  • stib
    stib over 10 years
    I was tearing my hair out trying to get an image sequence to encode at 24 fps, because even with the -r 24 flag before the -i flag it still reports the input sequence as having 25 tbr, 25 tbn, 25 tbc (ffmpeg speak for 25 fps frame rate). But it is actually interpreting the stream as 24 fps, without dropping frames.
  • Gyan
    Gyan over 7 years
    I don't get this behaviour. No frames dropped with three context changes (of only pixel format).
  • Camille Goudeseune
    Camille Goudeseune over 7 years
    Maybe ffmpeg fixed this problem sometime in past two years. (What fmt:s does your ffmpeg say it's reading?)
  • Gyan
    Gyan over 7 years
    The same switch : from RGB24 to PAL8 and back.
  • Shubham Agarwal
    Shubham Agarwal almost 6 years
    @CamilleGoudeseune Thanks for the reply, however, I fixed the problem. It was some concatenation problem because of different image format/resolution.
  • MSD Paul
    MSD Paul over 3 years
    The answer is really helpful. I was also stuck in this. Thanks :)
  • Admin
    Admin about 2 years
    This still leaves the output framerate at 25 fps or leads to skipped frames if I combine it with -r <fps> to force a custom framerate.
  • Admin
    Admin about 2 years
    Don't combine -framerate with -r. If your input is an image sequence, you can specify whatever framerate you desire for the output. Note you must put the -framerate option (and any other image2 options) before the input file option, for it to apply to that input.
  • Admin
    Admin about 2 years
    Ah, I had the order wrong, with the option before the input file it works. Thanks! Voting this answer up.