9

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

4
  • This might be a bug, but I haven't trawled the FFmpeg Bug Tracker for any existing related reports.
    – llogan
    May 30, 2013 at 0:13
  • If this is a bug this means it will just happen with a view videos and I may ignore this issue?
    – LarS
    Jun 3, 2013 at 17:04
  • Maybe it's related to this ticket: ffmpeg.org/trac/ffmpeg/ticket/187 - I reopened the ticket in the ffmpeg issue queue providing above information.
    – LarS
    Jun 3, 2013 at 18:02
  • Well, that ticket is the reason mp4 doesn't default to -vsync 2, I guess. That's what produced the massive frame duplication you saw (not the original bug that led to that workaround). -vsync 2 muxing to mp4 seems to work for me, though, with current git ffmpeg. Mar 1, 2015 at 3:06

2 Answers 2

6

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.

3
  • I have the same issue and adding vsync 2 fixed it. Can you explain what to look for in the file metadata to know to use the vsync 2 option? Thanks.
    – Shaun Bowe
    Mar 23, 2017 at 13:56
  • 3
    @ShaunBowe: It's hopefully safe to always use -vsync 2, even though that's not the default for the ffmpeg's MP4 muxer. But what you should look for is variable framerate input, e.g. using mediainfo. If it has a min/max framerate that aren't equal, it's VFR. You might be able to say something more specific about MP4 input in terms of the time-base and so on, but I'm not that familiar with how MP4 represents timestamps. Mar 24, 2017 at 14:57
  • 1
    (ShaunBowe) On Stream #0.0 .. video mpeg4 you'll see 14.97 fps. Normal frame rates are e.g. 24/25/60/120 etc. That's a quick catch that it's variable rate and not very suited to 264/mp4 with default settings. Apr 13, 2023 at 15:02
0

I couldn't see any issue with your video, using the following command on ffmpeg version 1.1.2:

ffmpeg -i standort_aquarium.mp4 -r 30000/1001 -vcodec libx264 output.mp4

The result file size is as expected (around half the size), the video was playing correctly and the frame-rate conversion seems to be working just fine (so not a bug).

The only issue I see with your output is that the steam mapping is missing (for unknown reason). On your output:

Stream mapping:

  Stream #0.0 -> #0.0
  Stream #0.1 -> #0.1

Where it should have be written:

Stream mapping:
  Stream #0:0 -> #0:0 (mpeg4 -> libx264)
  Stream #0:1 -> #0:1 (aac -> libfaac)

I assume you've got an issue with your ffmpeg binary/version (also, version 1.2.1 was never released). Try re-download or re-compile with version 1.1.2

2
  • The command in question is the one without -r option: ffmpeg -i '/tmp/standort_aquarium.mp4' -vcodec libx264 output.mp4
    – LarS
    Jun 7, 2013 at 22:50
  • may you test again without -r 30000/1001? Which version of ffmpeg are you using? I use versions 1.2.1 and 0.7.13 on mac provided by mac ports and 0.7.15 on a debian linux server.
    – LarS
    Jun 11, 2013 at 16:28

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .