[FFmpeg-trac] #5853(undetermined:new): M3U8 seeking is off or frame count is off

FFmpeg trac at avcodec.org
Mon Sep 19 21:46:24 EEST 2016


#5853: M3U8 seeking is off or frame count is off
-------------------------------------+-------------------------------------
             Reporter:  lletourn     |                     Type:  defect
               Status:  new          |                 Priority:  normal
            Component:               |                  Version:
  undetermined                       |  unspecified
             Keywords:  m3u8         |               Blocked By:
             Blocking:               |  Reproduced by developer:  0
Analyzed by developer:  0            |
-------------------------------------+-------------------------------------
 Summary of the bug:
 There are 2 mutually exclusive (but seem to be related) bugs

 1- When seeking, the position seeked to is off by many frames.
 2- When counting frames with ffprobe the number given is higher than
 expected

 How to reproduce:
 From master/HEAD:
 {{{
 % rm -f dude.png ; ./ffmpeg -y -ss 0 -vsync 0 -i
 https://s3.amazonaws.com/slffmpegdebug/seekProb/seekProb.m3u8 -f image2
 -q:v 1 -vframes 1  dude.png ; feh dude.png
 ffmpeg version N-81699-g590f025 Copyright (c) 2000-2016 the FFmpeg
 developers
   built with gcc 5.2.1 (Ubuntu 5.2.1-22ubuntu2) 20151010
   configuration: --enable-gpl --enable-libx264 --enable-nonfree --enable-
 libfdk-aac --enable-openssl --enable-static
   libavutil      55. 29.100 / 55. 29.100
   libavcodec     57. 57.100 / 57. 57.100
   libavformat    57. 49.100 / 57. 49.100
   libavdevice    57.  0.102 / 57.  0.102
   libavfilter     6. 62.100 /  6. 62.100
   libswscale      4.  1.100 /  4.  1.100
   libswresample   2.  1.100 /  2.  1.100
   libpostproc    54.  0.100 / 54.  0.100
 https://s3.amazonaws.com/slffmpegdebug/seekProb/seekProb.m3u8: could not
 seek to position 1.400
 Input #0, hls,applehttp, from
 'https://s3.amazonaws.com/slffmpegdebug/seekProb/seekProb.m3u8':
   Duration: 00:01:05.07, start: 1.400000, bitrate: 0 kb/s
   Program 0
     Metadata:
       variant_bitrate : 0
     Stream #0:0: Video: h264 (High) ([27][0][0][0] / 0x001B), yuv420p,
 1280x720 [SAR 1:1 DAR 16:9], 29.97 fps, 29.97 tbr, 90k tbn, 59.94 tbc
     Metadata:
       variant_bitrate : 0
     Stream #0:1: Audio: aac (LC) ([15][0][0][0] / 0x000F), 48000 Hz,
 stereo, fltp
     Metadata:
       variant_bitrate : 0
 [image2 @ 0x26f12a0] Using AVStream.codec to pass codec parameters to
 muxers is deprecated, use AVStream.codecpar instead.
 Output #0, image2, to 'dude.png':
   Metadata:
     encoder         : Lavf57.49.100
     Stream #0:0: Video: png, rgb24, 1280x720 [SAR 1:1 DAR 16:9], q=2-31,
 200 kb/s, 29.97 fps, 29.97 tbn, 29.97 tbc
     Metadata:
       variant_bitrate : 0
       encoder         : Lavc57.57.100 png
 Stream mapping:
   Stream #0:0 -> #0:0 (h264 (native) -> png (native))
 Press [q] to stop, [?] for help
 frame=    1 fps=0.0 q=-0.0 Lsize=N/A time=00:00:05.07 bitrate=N/A speed=
 11x
 video:570kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB
 muxing overhead: unknown

 }}}

 I did notice the message {{{could not seek to position 1.400}}} although I
 asked 0.

 In any case it doesn't give the same image as
 (notice the absence of -ss 0)

 {{{
 % rm -f dude.png ; ./ffmpeg -y -vsync 0 -i
 https://s3.amazonaws.com/slffmpegdebug/seekProb/seekProb.m3u8 -f image2
 -q:v 1 -vframes 1  dude.png ; feh dude.png
 ffmpeg version N-81699-g590f025 Copyright (c) 2000-2016 the FFmpeg
 developers
   built with gcc 5.2.1 (Ubuntu 5.2.1-22ubuntu2) 20151010
   configuration: --enable-gpl --enable-libx264 --enable-nonfree --enable-
 libfdk-aac --enable-openssl --enable-static
   libavutil      55. 29.100 / 55. 29.100
   libavcodec     57. 57.100 / 57. 57.100
   libavformat    57. 49.100 / 57. 49.100
   libavdevice    57.  0.102 / 57.  0.102
   libavfilter     6. 62.100 /  6. 62.100
   libswscale      4.  1.100 /  4.  1.100
   libswresample   2.  1.100 /  2.  1.100
   libpostproc    54.  0.100 / 54.  0.100
 Input #0, hls,applehttp, from
 'https://s3.amazonaws.com/slffmpegdebug/seekProb/seekProb.m3u8':
   Duration: 00:01:05.07, start: 1.400000, bitrate: 0 kb/s
   Program 0
     Metadata:
       variant_bitrate : 0
     Stream #0:0: Video: h264 (High) ([27][0][0][0] / 0x001B), yuv420p,
 1280x720 [SAR 1:1 DAR 16:9], 29.97 fps, 29.97 tbr, 90k tbn, 59.94 tbc
     Metadata:
       variant_bitrate : 0
     Stream #0:1: Audio: aac (LC) ([15][0][0][0] / 0x000F), 48000 Hz,
 stereo, fltp
     Metadata:
       variant_bitrate : 0
 [image2 @ 0x27d9800] Using AVStream.codec to pass codec parameters to
 muxers is deprecated, use AVStream.codecpar instead.
 Output #0, image2, to 'dude.png':
   Metadata:
     encoder         : Lavf57.49.100
     Stream #0:0: Video: png, rgb24, 1280x720 [SAR 1:1 DAR 16:9], q=2-31,
 200 kb/s, 29.97 fps, 29.97 tbn, 29.97 tbc
     Metadata:
       variant_bitrate : 0
       encoder         : Lavc57.57.100 png
 Stream mapping:
   Stream #0:0 -> #0:0 (h264 (native) -> png (native))
 Press [q] to stop, [?] for help
 frame=    1 fps=0.0 q=-0.0 Lsize=N/A time=00:00:00.06 bitrate=N/A
 speed=0.542x
 video:563kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB
 muxing overhead: unknown
 }}}

 In the 3.1 branch. This commit 309fa24f361 (found with bisect) doesn't
 have the seeking problem, but it has a frame count problem.

 From master/HEAD
 {{{
 % ./ffprobe -show_entries stream=nb_read_frames -count_frames -pretty
 /data/sportlogiq/videos/2708/2708-1.m3u8
 ffprobe version N-81699-g590f025 Copyright (c) 2007-2016 the FFmpeg
 developers
   built with gcc 5.2.1 (Ubuntu 5.2.1-22ubuntu2) 20151010
   configuration: --enable-gpl --enable-libx264 --enable-nonfree --enable-
 libfdk-aac --enable-openssl --enable-static
   libavutil      55. 29.100 / 55. 29.100
   libavcodec     57. 57.100 / 57. 57.100
   libavformat    57. 49.100 / 57. 49.100
   libavdevice    57.  0.102 / 57.  0.102
   libavfilter     6. 62.100 /  6. 62.100
   libswscale      4.  1.100 /  4.  1.100
   libswresample   2.  1.100 /  2.  1.100
   libpostproc    54.  0.100 / 54.  0.100
 Input #0, hls,applehttp, from '/data/sportlogiq/videos/2708/2708-1.m3u8':
   Duration: 00:37:20.01, start: 1.400000, bitrate: 0 kb/s
   Program 0
     Metadata:
       variant_bitrate : 0
     Stream #0:0: Video: h264 (High) ([27][0][0][0] / 0x001B), yuv420p,
 1280x720 [SAR 1:1 DAR 16:9], 29.97 fps, 29.97 tbr, 90k tbn, 59.94 tbc
     Metadata:
       variant_bitrate : 0
     Stream #0:1: Audio: aac (LC) ([15][0][0][0] / 0x000F), 48000 Hz,
 stereo, fltp
     Metadata:
       variant_bitrate : 0
 [PROGRAM]
 [STREAM]
 nb_read_frames=67133
 [/STREAM]
 [STREAM]
 nb_read_frames=105002
 [/STREAM]
 [/PROGRAM]
 [STREAM]
 nb_read_frames=67133
 [/STREAM]
 [STREAM]
 nb_read_frames=105002
 [/STREAM]

 % git checkout 309fa24f361
 % make clean ; make distclean ; ./configure --enable-gpl --enable-libx264
 --enable-nonfree --enable-libfdk-aac --enable-openssl --enable-static &&
 make -j5
 % ./ffprobe -show_entries stream=nb_read_frames -count_frames -pretty
 /data/sportlogiq/videos/2708/2708-1.m3u8
 ffprobe version n3.1.1-25-g309fa24 Copyright (c) 2007-2016 the FFmpeg
 developers
   built with gcc 5.2.1 (Ubuntu 5.2.1-22ubuntu2) 20151010
   configuration: --enable-gpl --enable-libx264 --enable-nonfree --enable-
 libfdk-aac --enable-openssl --enable-static
   libavutil      55. 28.100 / 55. 28.100
   libavcodec     57. 48.101 / 57. 48.101
   libavformat    57. 41.100 / 57. 41.100
   libavdevice    57.  0.101 / 57.  0.101
   libavfilter     6. 47.100 /  6. 47.100
   libswscale      4.  1.100 /  4.  1.100
   libswresample   2.  1.100 /  2.  1.100
   libpostproc    54.  0.100 / 54.  0.100
 [hls,applehttp @ 0x31c2860] No longer receiving playlist 0
 [hls,applehttp @ 0x31c2860] Now receiving playlist 0, segment 0
 Input #0, hls,applehttp, from '/data/sportlogiq/videos/2708/2708-1.m3u8':
   Duration: 00:37:20.01, start: 1.400000, bitrate: 0 kb/s
   Program 0
     Metadata:
       variant_bitrate : 0
     Stream #0:0: Video: h264 (High) ([27][0][0][0] / 0x001B), yuv420p,
 1280x720 [SAR 1:1 DAR 16:9], 29.97 fps, 29.97 tbr, 90k tbn, 59.94 tbc
     Stream #0:1: Audio: aac (LC) ([15][0][0][0] / 0x000F), 48000 Hz,
 stereo, fltp, 132 kb/s
 [mpegts @ 0x31e5b00] DTS 129840 < 577287 out of order
 [hls,applehttp @ 0x31c2860] DTS 129840 < 577287 out of order
 [PROGRAM]
 [STREAM]
 nb_read_frames=67283
 [/STREAM]
 [STREAM]
 nb_read_frames=105239
 [/STREAM]
 [/PROGRAM]
 [STREAM]
 nb_read_frames=67283
 [/STREAM]
 [STREAM]
 nb_read_frames=105239
 [/STREAM]
 }}}

 If I convert the video to mp4 (using codec copy), the seeking works(frame
 image is what is expected) and frame counting gives the expected value
 (67133).

 Finally, the matching commit from 3.1 (309fa24) into master (9884f17)
 still has the seeking problem although it's the same modification to
 hls.c, so something else must be interfering in the code.

 The seeking video example
 'https://s3.amazonaws.com/slffmpegdebug/seekProb/seekProb.m3u8' is
 publicly available if you want to test (it was cut from a bigger one but
 reproduces the problem)

 I hope all this is clear.

 Might be related to #5728

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


More information about the FFmpeg-trac mailing list