Problems with frame rate on video conversion using ffmpeg with libx264

.mp4ffmpeg

I have problems with transcoding some videos. I ran the most simple ffmpeg command and it takes very long time and the output file is about 10 times bigger. If I provide the frame rate parameter -r it works well (small file, fast transcoding). What is the problem and how can I solve it? I don't want to set a fixed frame rate because I guess it's better to leave it the same as source, isn't it?.

Maybe the problem is something else, because I found many examples in web where the -r option isn't used. Also transcoding to a different format or with a different source works well without -r option (I tried with ffmpeg 0.7.13 and 1.2.1 on mac os (provided by mac ports) and 0.7.15 on a debian linux server). The videos are provided by the users of my website and automatically converted to be suitable for the web. So I need the most general command for automatic conversion.

In the following ffmpeg output you will find this two suspicious messages:

  • Frame rate very high for a muxer not effciciently supporting it. Please consider specifiying a lower framerate, a different muxer or -vsync 2
  • MB rate (36000000) > level limit (983040)

The ffmpeg command and output (without -r option):


    ffmpeg -i '/tmp/standort_aquarium.mp4' -vcodec libx264 output.mp4
    ffmpeg version 0.7.15, Copyright (c) 2000-2013 the FFmpeg developers  built on Feb 22 2013 07:18:58 with gcc 4.4.5  configuration: --enable-libdc1394 --prefix=/usr --extra-cflags='-Wall -g ' --cc='ccache cc' --enable-shared --enable-libmp3lame --enable-gpl --enable-libvorbis --enable-pthreads --enable-libfaac --enable-libxvid --enable-postproc --enable-x11grab --enable-libgsm --enable-libtheora --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libx264 --enable-libspeex --enable-nonfree --disable-stripping --enable-avfilter --enable-libdirac --disable-decoder=libdirac --enable-libfreetype --enable-libschroedinger --disable-encoder=libschroedinger --enable-version3 --enable-libopenjpeg --enable-libvpx --enable-librtmp --extra-libs=-lgcrypt --disable-altivec --disable-armv5te --disable-armv6 --disable-vis
      libavutil    50. 43. 0 / 50. 43. 0
      libavcodec   52.123. 0 / 52.123. 0
      libavformat  52.111. 0 / 52.111. 0
      libavdevice  52.  5. 0 / 52.  5. 0
      libavfilter   1. 80. 0 /  1. 80. 0
      libswscale    0. 14. 1 /  0. 14. 1
      libpostproc  51.  2. 0 / 51.  2. 0
    Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/tmp/standort_aquarium.mp4':
      Metadata:
        major_brand     : mp42
        minor_version   : 0
        compatible_brands: mp423gp4isom
        creation_time   : 2013-04-19 15:04:05
      Duration: 00:00:18.24, start: 0.000000, bitrate: 2095 kb/s
        Stream #0.0(und): Video: mpeg4, yuv420p, 640x480 [PAR 1:1 DAR 4:3], 2001 kb/s, 14.97 fps, 30k tbr, 30k tbn, 30k tbc
        Metadata:
          creation_time   : 2013-04-19 15:04:05
        Stream #0.1(und): Audio: aac, 48000 Hz, mono, s16, 96 kb/s
        Metadata:
          creation_time   : 2013-04-19 15:04:05
    File 'output.mp4' already exists. Overwrite ? [y/N] y
    [mp4 @ 0x20eed80] Frame rate very high for a muxer not effciciently supporting it.
    Please consider specifiying a lower framerate, a different muxer or -vsync 2
    [buffer @ 0x20f8820] w:640 h:480 pixfmt:yuv420p tb:1/1000000 sar:1/1 sws_param:
    [libx264 @ 0x20efde0] Default settings detected, using medium profile
    [libx264 @ 0x20efde0] using SAR=1/1
    [libx264 @ 0x20efde0] MB rate (36000000) > level limit (983040)
    [libx264 @ 0x20efde0] using cpu capabilities: MMX2 SSE2Fast SSSE3 FastShuffle SSE4.2
    [libx264 @ 0x20efde0] profile High, level 5.1
    [libx264 @ 0x20efde0] 264 - core 118 - H.264/MPEG-4 AVC codec - Copyleft 2003-2011 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=1 sliced_threads=0 nr=0 decimate=1 interlaced=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=25 scenecut=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 'output.mp4':
      Metadata:
        major_brand     : mp42
        minor_version   : 0
        compatible_brands: mp423gp4isom
        creation_time   : 2013-04-19 15:04:05
        encoder         : Lavf52.111.0
        Stream #0.0(und): Video: libx264, yuv420p, 640x480 [PAR 1:1 DAR 4:3], q=2-31, 200 kb/s, 30k tbn, 30k tbc
        Metadata:
          creation_time   : 2013-04-19 15:04:05
        Stream #0.1(und): Audio: libfaac, 48000 Hz, mono, s16, 64 kb/s
        Metadata:
          creation_time   : 2013-04-19 15:04:05
    Stream mapping:
      Stream #0.0 -> #0.0
      Stream #0.1 -> #0.1
    Press [q] to stop, [?] for help
    frame=542630 fps=132 q=33.0 Lsize=   77226kB time=00:00:18.08 bitrate=34976.2kbits/s dup=542358 drop=0
    video:68604kB audio:143kB global headers:0kB muxing overhead 12.333275%
    frame I:2174  Avg QP:18.72  size: 25040
    [libx264 @ 0x20efde0] frame P:136846 Avg QP:25.27  size:    56
    [libx264 @ 0x20efde0] frame B:403610 Avg QP:32.99  size:    20
    [libx264 @ 0x20efde0] consecutive B-frames:  0.8%  0.0%  0.1% 99.1%
    [libx264 @ 0x20efde0] mb I  I16..4:  5.5% 83.3% 11.1%
    [libx264 @ 0x20efde0] mb P  I16..4:  0.0%  0.0%  0.0%  P16..4:  0.5%  0.0%  0.0%  0.0%  0.0%    skip:99.4%
    [libx264 @ 0x20efde0] mb B  I16..4:  0.0%  0.0%  0.0%  B16..8:  0.0%  0.0%  0.0%  direct: 0.0%  skip:100.0%  L0:21.2% L1:78.8% BI: 0.0%
    [libx264 @ 0x20efde0] 8x8 transform intra:83.1% inter:85.2%
    [libx264 @ 0x20efde0] coded y,uvDC,uvAC intra: 91.2% 95.8% 80.7% inter: 0.0% 0.1% 0.0%
    [libx264 @ 0x20efde0] i16 v,h,dc,p: 13% 40% 12% 35%
    [libx264 @ 0x20efde0] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 19% 34% 15%  4%  4%  5%  6%  7%  8%
    [libx264 @ 0x20efde0] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 20% 38%  6%  4%  6%  6%  8%  6%  6%
    [libx264 @ 0x20efde0] i8c dc,h,v,p: 39% 32% 19% 10%
    [libx264 @ 0x20efde0] Weighted P-Frames: Y:0.0% UV:0.0%
    [libx264 @ 0x20efde0] ref P L0: 91.5%  5.2%  2.8%  0.4%  0.0%
    [libx264 @ 0x20efde0] ref B L0: 55.7% 43.5%  0.8%
    [libx264 @ 0x20efde0] ref B L1: 97.9%  2.1%
    [libx264 @ 0x20efde0] kb/s:31071.04

The ffmpeg command and output with the -r 24 option:


    ffmpeg -i '/tmp/standort_aquarium.mp4' -r 30000/1001 -vcodec libx264 output.mp4
    ffmpeg version 0.7.15, Copyright (c) 2000-2013 the FFmpeg developers
      built on Feb 22 2013 07:18:58 with gcc 4.4.5
      configuration: --enable-libdc1394 --prefix=/usr --extra-cflags='-Wall -g ' --cc='ccache cc' --enable-shared --enable-libmp3lame --enable-gpl --enable-libvorbis --enable-pthreads --enable-libfaac --enable-libxvid --enable-postproc --enable-x11grab --enable-libgsm --enable-libtheora --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libx264 --enable-libspeex --enable-nonfree --disable-stripping --enable-avfilter --enable-libdirac --disable-decoder=libdirac --enable-libfreetype --enable-libschroedinger --disable-encoder=libschroedinger --enable-version3 --enable-libopenjpeg --enable-libvpx --enable-librtmp --extra-libs=-lgcrypt --disable-altivec --disable-armv5te --disable-armv6 --disable-vis
      libavutil    50. 43. 0 / 50. 43. 0
      libavcodec   52.123. 0 / 52.123. 0
      libavformat  52.111. 0 / 52.111. 0
      libavdevice  52.  5. 0 / 52.  5. 0
      libavfilter   1. 80. 0 /  1. 80. 0
      libswscale    0. 14. 1 /  0. 14. 1
      libpostproc  51.  2. 0 / 51.  2. 0
    Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/tmp/standort_aquarium.mp4':
      Metadata:
        major_brand     : mp42
        minor_version   : 0
        compatible_brands: mp423gp4isom
        creation_time   : 2013-04-19 15:04:05
      Duration: 00:00:18.24, start: 0.000000, bitrate: 2095 kb/s
        Stream #0.0(und): Video: mpeg4, yuv420p, 640x480 [PAR 1:1 DAR 4:3], 2001 kb/s, 14.97 fps, 30k tbr, 30k tbn, 30k tbc
        Metadata:
          creation_time   : 2013-04-19 15:04:05
        Stream #0.1(und): Audio: aac, 48000 Hz, mono, s16, 96 kb/s
        Metadata:
          creation_time   : 2013-04-19 15:04:05
    File 'output.mp4' already exists. Overwrite ? [y/N] y
    [buffer @ 0x132e820] w:640 h:480 pixfmt:yuv420p tb:1/1000000 sar:1/1 sws_param:
    [libx264 @ 0x1325de0] Default settings detected, using medium profile
    [libx264 @ 0x1325de0] using SAR=1/1
    [libx264 @ 0x1325de0] using cpu capabilities: MMX2 SSE2Fast SSSE3 FastShuffle SSE4.2
    [libx264 @ 0x1325de0] profile High, level 3.0
    [libx264 @ 0x1325de0] 264 - core 118 - H.264/MPEG-4 AVC codec - Copyleft 2003-2011 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=1 sliced_threads=0 nr=0 decimate=1 interlaced=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=25 scenecut=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 'output.mp4':
      Metadata:
        major_brand     : mp42
        minor_version   : 0
        compatible_brands: mp423gp4isom
        creation_time   : 2013-04-19 15:04:05
        encoder         : Lavf52.111.0
        Stream #0.0(und): Video: libx264, yuv420p, 640x480 [PAR 1:1 DAR 4:3], q=2-31, 200 kb/s, 30k tbn, 29.97 tbc
        Metadata:
          creation_time   : 2013-04-19 15:04:05
        Stream #0.1(und): Audio: libfaac, 48000 Hz, mono, s16, 64 kb/s
        Metadata:
          creation_time   : 2013-04-19 15:04:05
    Stream mapping:
      Stream #0.0 -> #0.0
      Stream #0.1 -> #0.1
    Press [q] to stop, [?] for help
    frame=  542 fps= 36 q=29.0 Lsize=    2059kB time=00:00:18.01 bitrate= 936.3kbits/s dup=270 drop=0
    video:1904kB audio:143kB global headers:0kB muxing overhead 0.609224%
    frame I:3     Avg QP:22.39  size: 14773
    [libx264 @ 0x1325de0] frame P:514   Avg QP:23.98  size:  3675
    [libx264 @ 0x1325de0] frame B:25    Avg QP:27.44  size:   643
    [libx264 @ 0x1325de0] consecutive B-frames: 93.7%  0.0%  1.1%  5.2%
    [libx264 @ 0x1325de0] mb I  I16..4: 16.4% 78.3%  5.3%
    [libx264 @ 0x1325de0] mb P  I16..4:  1.6%  6.3%  0.3%  P16..4: 30.8%  8.6%  3.1%  0.0%  0.0%    skip:49.4%
    [libx264 @ 0x1325de0] mb B  I16..4:  0.4%  0.7%  0.0%  B16..8: 13.2%  1.6%  0.2%  direct: 0.3%  skip:83.6%  L0:50.0% L1:47.1% BI: 2.9%
    [libx264 @ 0x1325de0] 8x8 transform intra:77.1% inter:83.1%
    [libx264 @ 0x1325de0] coded y,uvDC,uvAC intra: 62.0% 76.4% 24.4% inter: 17.9% 26.3% 2.3%
    [libx264 @ 0x1325de0] i16 v,h,dc,p: 14% 60% 13% 13%
    [libx264 @ 0x1325de0] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 15% 35% 33%  2%  3%  3%  3%  3%  4%
    [libx264 @ 0x1325de0] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 15% 40% 12%  4%  7%  7%  7%  5%  4%
    [libx264 @ 0x1325de0] i8c dc,h,v,p: 46% 34% 16%  4%
    [libx264 @ 0x1325de0] Weighted P-Frames: Y:8.0% UV:4.5%
    [libx264 @ 0x1325de0] ref P L0: 65.6% 16.7%  8.8%  7.9%  0.9%
    [libx264 @ 0x1325de0] ref B L0: 85.9% 13.3%  0.8%
    [libx264 @ 0x1325de0] ref B L1: 88.7% 11.3%
    [libx264 @ 0x1325de0] kb/s:862.28

The video source is temporarily available under: https://www.dropbox.com/s/4xg147z77u40g87/standort_aquarium.mp4

Best Answer

The problem is that ffmpeg chooses the default for -vsync based on the output muxer. Its mp4 muxer defaults to vsync 1, but it chooses a very high framerate so that it can put a frame at the exact right time for every input frame.

(The input frame timing isn't constant. It averages 14.97 fps, according to ffmpeg. Probably from a phone camera? They do variable FPS. I think they slow down to get more light for each frame, but it might be another reason.)

So ffmpeg will duplicate frames up to the 30k fps that it's chosen, or something. h.264 is pretty efficient at storing duplicate frames, but that's ridiculous.

Anyway, the solution is to use -vsync 2 on your ffmpeg command line. Or output to mkv, and then remux to mp4, but the reason that works is that mkv defaults to -vsync 2. It's really that simple. You don't need to make your output CFR. Youtube handles arbitrary frame rates just fine, as long as they're <= 60, and so do most other players. I assume phones are fine, since they make variable FPS videos in the first place. You don't need to use -r something to force frame duplication to hit exactly 30fps or anything.

Related Question