[FFmpeg-trac] #5935(undetermined:new): Duration glitch and seek offset problems with transcodes to h264/aac/mp4

FFmpeg trac at avcodec.org
Wed Nov 9 18:58:46 EET 2016


#5935: Duration glitch and seek offset problems with transcodes to h264/aac/mp4
-------------------------------------+-------------------------------------
             Reporter:  NeilSlater-  |                     Type:  defect
  Excession                          |                 Priority:  normal
               Status:  new          |                  Version:  git-
            Component:               |  master
  undetermined                       |               Blocked By:
             Keywords:  duration     |  Reproduced by developer:  0
  timing                             |
             Blocking:               |
Analyzed by developer:  0            |
-------------------------------------+-------------------------------------
 Summary of the bug: When transcoding content to h264/aac/mp4, ffmpeg
 writes timing metadata such that duration is longer than expected, and
 resulting videos do not seek accurately in HTML5 video player (Chrome and
 Firefox exhibit same behaviour). I have confirmed with alternative content
 that the HTML5 player does not always do this - it is specifically content
 transcoded using ffmpeg, and appears on *all* content transcoded to
 h264/aac/mp4. It does not appear on content without audio.

 How to reproduce: As the fault is quite subtle in nature, I have put
 together a MCVE with a few variations at https://github.com/Neil-
 Aframe/ffmpeg_timing_examples - this includes sample output from ffmbc to
 same target format which does not exhibit the fault.

 Below is typical command which results in fault:

 {{{
 %ffprobe outputs/ffmbc_h264_aac.mp4 2>&1 | grep "Duration"
   Duration: 00:00:02.40, start: 0.000000, bitrate: 204 kb/s

 % ffmpeg -y -i outputs/ffmbc_h264_aac.mp4 -f mp4 -c:v h264 -c:a aac -vb 1M
 test.mp4
 ffmpeg version git-2016-11-08-1bbb18f Copyright (c) 2000-2016 the FFmpeg
 developers
   built with Apple LLVM version 7.0.2 (clang-700.1.81)
   configuration: --prefix=/usr/local/Cellar/ffmpeg/HEAD-1bbb18f --enable-
 shared --enable-pthreads --enable-gpl --enable-version3 --enable-
 hardcoded-tables --enable-avresample --cc=clang --host-cflags= --host-
 ldflags= --enable-ffplay --enable-libass --enable-libfdk-aac --enable-
 libfreetype --enable-libmp3lame --enable-libopus --enable-libvorbis
 --enable-libvpx --enable-libx264 --enable-libx265 --enable-libxvid
 --enable-opencl --disable-lzma --enable-nonfree --enable-vda
   libavutil      55. 35.100 / 55. 35.100
   libavcodec     57. 66.101 / 57. 66.101
   libavformat    57. 57.100 / 57. 57.100
   libavdevice    57.  2.100 / 57.  2.100
   libavfilter     6. 66.100 /  6. 66.100
   libavresample   3.  2.  0 /  3.  2.  0
   libswscale      4.  3.100 /  4.  3.100
   libswresample   2.  4.100 /  2.  4.100
   libpostproc    54.  2.100 / 54.  2.100
 Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'outputs/ffmbc_h264_aac.mp4':
   Metadata:
     major_brand     : mp42
     minor_version   : 0
     compatible_brands: isomiso2avc1mp41
     creation_time   : 2016-11-09T14:35:58.000000Z
     encoder         : FFmbc 0.7
   Duration: 00:00:02.40, start: 0.000000, bitrate: 204 kb/s
     Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p,
 690x360 [SAR 1:1 DAR 23:12], 129 kb/s, 25 fps, 25 tbr, 25 tbn, 50 tbc
 (default)
     Metadata:
       creation_time   : 2016-11-09T14:35:58.000000Z
       handler_name    : VideoHandler
     Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz,
 stereo, fltp, 62 kb/s (default)
     Metadata:
       creation_time   : 2016-11-09T14:35:58.000000Z
       handler_name    : SoundHandler
 [libx264 @ 0x7fd035800c00] using SAR=1/1
 [libx264 @ 0x7fd035800c00] using cpu capabilities: MMX2 SSE2Fast SSSE3
 SSE4.2 AVX
 [libx264 @ 0x7fd035800c00] profile High, level 3.0
 [libx264 @ 0x7fd035800c00] 264 - core 148 r2699 a5e06b9 - H.264/MPEG-4 AVC
 codec - Copyleft 2003-2016 - 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=6
 lookahead_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=abr mbtree=1 bitrate=1000
 ratetol=1.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00
 Output #0, mp4, to 'test.mp4':
   Metadata:
     major_brand     : mp42
     minor_version   : 0
     compatible_brands: isomiso2avc1mp41
     encoder         : Lavf57.57.100
     Stream #0:0(und): Video: h264 (libx264) ([33][0][0][0] / 0x0021),
 yuv420p, 690x360 [SAR 1:1 DAR 23:12], q=-1--1, 1000 kb/s, 25 fps, 12800
 tbn, 25 tbc (default)
     Metadata:
       creation_time   : 2016-11-09T14:35:58.000000Z
       handler_name    : VideoHandler
       encoder         : Lavc57.66.101 libx264
     Side data:
       cpb: bitrate max/min/avg: 0/0/1000000 buffer size: 0 vbv_delay: -1
     Stream #0:1(und): Audio: aac (LC) ([64][0][0][0] / 0x0040), 44100 Hz,
 stereo, fltp, 128 kb/s (default)
     Metadata:
       creation_time   : 2016-11-09T14:35:58.000000Z
       handler_name    : SoundHandler
       encoder         : Lavc57.66.101 aac
 Stream mapping:
   Stream #0:0 -> #0:0 (h264 (native) -> h264 (libx264))
   Stream #0:1 -> #0:1 (aac (native) -> aac (native))
 Press [q] to stop, [?] for help
 frame=   60 fps=0.0 q=-1.0 Lsize=     143kB time=00:00:02.43 bitrate=
 480.3kbits/s speed=5.24x
 video:102kB audio:38kB subtitle:0kB other streams:0kB global headers:0kB
 muxing overhead: 2.314983%
 [libx264 @ 0x7fd035800c00] frame I:1     Avg QP:15.49  size: 20251
 [libx264 @ 0x7fd035800c00] frame P:16    Avg QP: 6.87  size:  4051
 [libx264 @ 0x7fd035800c00] frame B:43    Avg QP:16.15  size:   438
 [libx264 @ 0x7fd035800c00] consecutive B-frames:  1.7%  6.7%  5.0% 86.7%
 [libx264 @ 0x7fd035800c00] mb I  I16..4:  5.1% 77.3% 17.6%
 [libx264 @ 0x7fd035800c00] mb P  I16..4:  0.1%  0.1%  0.3%  P16..4: 24.5%
 1.2%  2.9%  0.0%  0.0%    skip:70.8%
 [libx264 @ 0x7fd035800c00] mb B  I16..4:  0.1%  0.0%  0.1%  B16..8:  9.0%
 0.4%  0.4%  direct: 0.3%  skip:89.8%  L0:17.7% L1:81.6% BI: 0.7%
 [libx264 @ 0x7fd035800c00] final ratefactor: 7.05
 [libx264 @ 0x7fd035800c00] 8x8 transform intra:69.4% inter:39.7%
 [libx264 @ 0x7fd035800c00] coded y,uvDC,uvAC intra: 82.6% 82.8% 79.5%
 inter: 3.8% 4.1% 3.4%
 [libx264 @ 0x7fd035800c00] i16 v,h,dc,p: 34% 56%  7%  3%
 [libx264 @ 0x7fd035800c00] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 32% 13% 15%  5%
 7%  9%  5%  9%  6%
 [libx264 @ 0x7fd035800c00] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 37% 19% 11%  6%
 7%  7%  5%  5%  3%
 [libx264 @ 0x7fd035800c00] i8c dc,h,v,p: 43% 20% 29%  9%
 [libx264 @ 0x7fd035800c00] Weighted P-Frames: Y:0.0% UV:0.0%
 [libx264 @ 0x7fd035800c00] ref P L0: 93.4%  1.0%  4.0%  1.6%
 [libx264 @ 0x7fd035800c00] ref B L0: 73.2% 22.6%  4.2%
 [libx264 @ 0x7fd035800c00] ref B L1: 89.1% 10.9%
 [libx264 @ 0x7fd035800c00] kb/s:346.36

 % ffprobe test.mp4 2>&1 | grep "Duration"
   Duration: 00:00:02.44, start: 0.000000, bitrate: 480 kb/s
 }}}

 In the above case, the output file reports incorrect duration, but
 otherwise plays and seeks to correct frame OK. This is an exception to
 what I usually get with production data though, which has same duration
 glitch but also lags a frame, sometimes 2 frames, when HTML5 video player
 seeks to a specific time.

 In production, the fault is complicated with other issues (to do with H264
 GOP settings). However, the following is common to almost all production
 inputs I have tried:

  * ffmbc output does not exhibit the fault. Duration and player seek are
 accurate.

  * Latest ffmpeg version transcoding to vp8/vorbis/webm usually has
 desired correct behaviour, accurate duration and no seek problems. It
 doesn't for unknown reason in my test example.

 It is the success of the alternatives (along with the odd duration
 reported) which makes me think this is a fault in ffmpeg and not in HTML5
 player.

 In addition, I have tried (but not logged in detail) all available h264
 encoder libraries, quite a few variations of h264 flags, and also
 confirmed the fault (or maybe a similar one) appears in versions 2.7.2 and
 2.6.1

--
Ticket URL: <https://trac.ffmpeg.org/ticket/5935>
FFmpeg <https://ffmpeg.org>
FFmpeg issue tracker


More information about the FFmpeg-trac mailing list