[FFmpeg-trac] #6915(avformat:open): DASH audio segments duration doesn't match exactly with video segments duration.

FFmpeg trac at avcodec.org
Fri Dec 22 01:03:42 EET 2017


#6915: DASH audio segments duration doesn't match exactly with video segments
duration.
------------------------------------+-------------------------------------
             Reporter:  beloko      |                    Owner:  stevenliu
                 Type:  defect      |                   Status:  open
             Priority:  normal      |                Component:  avformat
              Version:  git-master  |               Resolution:
             Keywords:              |               Blocked By:
             Blocking:              |  Reproduced by developer:  0
Analyzed by developer:  0           |
------------------------------------+-------------------------------------

Comment (by beloko):

 You're absolutely right.

 Here is an interesting sample provided by Apple to study :
 https://devstreaming-
 cdn.apple.com/videos/streaming/examples/img_bipbop_adv_example_ts/master.m3u8

 This HLS stream contain 8 video tracks and 3 variant audio tracks.

 Here is the master.m3u8 content :


 {{{
 #EXTM3U
 #EXT-X-VERSION:6
 #EXT-X-INDEPENDENT-SEGMENTS

 #EXT-X-STREAM-INF:AVERAGE-
 BANDWIDTH=2218327,BANDWIDTH=2227464,CODECS="avc1.640020,mp4a.40.2",RESOLUTION=960x540
 ,FRAME-RATE=60.000,CLOSED-CAPTIONS="cc1",AUDIO="aud1",SUBTITLES="sub1"
 v5/prog_index.m3u8
 #EXT-X-STREAM-INF:AVERAGE-
 BANDWIDTH=8144656,BANDWIDTH=8178040,CODECS="avc1.64002a,mp4a.40.2",RESOLUTION=1920x1080
 ,FRAME-RATE=60.000,CLOSED-CAPTIONS="cc1",AUDIO="aud1",SUBTITLES="sub1"
 v9/prog_index.m3u8
 #EXT-X-STREAM-INF:AVERAGE-
 BANDWIDTH=6307144,BANDWIDTH=6453202,CODECS="avc1.64002a,mp4a.40.2",RESOLUTION=1920x1080
 ,FRAME-RATE=60.000,CLOSED-CAPTIONS="cc1",AUDIO="aud1",SUBTITLES="sub1"
 v8/prog_index.m3u8
 #EXT-X-STREAM-INF:AVERAGE-
 BANDWIDTH=4775338,BANDWIDTH=5054232,CODECS="avc1.64002a,mp4a.40.2",RESOLUTION=1920x1080
 ,FRAME-RATE=60.000,CLOSED-CAPTIONS="cc1",AUDIO="aud1",SUBTITLES="sub1"
 v7/prog_index.m3u8
 #EXT-X-STREAM-INF:AVERAGE-
 BANDWIDTH=3240596,BANDWIDTH=3289288,CODECS="avc1.640020,mp4a.40.2",RESOLUTION=1280x720
 ,FRAME-RATE=60.000,CLOSED-CAPTIONS="cc1",AUDIO="aud1",SUBTITLES="sub1"
 v6/prog_index.m3u8
 #EXT-X-STREAM-INF:AVERAGE-
 BANDWIDTH=1292926,BANDWIDTH=1296989,CODECS="avc1.64001e,mp4a.40.2",RESOLUTION=768x432
 ,FRAME-RATE=30.000,CLOSED-CAPTIONS="cc1",AUDIO="aud1",SUBTITLES="sub1"
 v4/prog_index.m3u8
 #EXT-X-STREAM-INF:AVERAGE-
 BANDWIDTH=914722,BANDWIDTH=922242,CODECS="avc1.64001e,mp4a.40.2",RESOLUTION=640x360
 ,FRAME-RATE=30.000,CLOSED-CAPTIONS="cc1",AUDIO="aud1",SUBTITLES="sub1"
 v3/prog_index.m3u8
 #EXT-X-STREAM-INF:AVERAGE-
 BANDWIDTH=541239,BANDWIDTH=553010,CODECS="avc1.640015,mp4a.40.2",RESOLUTION=480x270
 ,FRAME-RATE=30.000,CLOSED-CAPTIONS="cc1",AUDIO="aud1",SUBTITLES="sub1"
 v2/prog_index.m3u8

 #EXT-X-STREAM-INF:AVERAGE-
 BANDWIDTH=2439704,BANDWIDTH=2448841,CODECS="avc1.640020,ac-3",RESOLUTION=960x540
 ,FRAME-RATE=60.000,CLOSED-CAPTIONS="cc1",AUDIO="aud2",SUBTITLES="sub1"
 v5/prog_index.m3u8
 #EXT-X-STREAM-INF:AVERAGE-
 BANDWIDTH=8366033,BANDWIDTH=8399417,CODECS="avc1.64002a,ac-3",RESOLUTION=1920x1080
 ,FRAME-RATE=60.000,CLOSED-CAPTIONS="cc1",AUDIO="aud2",SUBTITLES="sub1"
 v9/prog_index.m3u8
 #EXT-X-STREAM-INF:AVERAGE-
 BANDWIDTH=6528521,BANDWIDTH=6674579,CODECS="avc1.64002a,ac-3",RESOLUTION=1920x1080
 ,FRAME-RATE=60.000,CLOSED-CAPTIONS="cc1",AUDIO="aud2",SUBTITLES="sub1"
 v8/prog_index.m3u8
 #EXT-X-STREAM-INF:AVERAGE-
 BANDWIDTH=4996715,BANDWIDTH=5275609,CODECS="avc1.64002a,ac-3",RESOLUTION=1920x1080
 ,FRAME-RATE=60.000,CLOSED-CAPTIONS="cc1",AUDIO="aud2",SUBTITLES="sub1"
 v7/prog_index.m3u8
 #EXT-X-STREAM-INF:AVERAGE-
 BANDWIDTH=3461973,BANDWIDTH=3510665,CODECS="avc1.640020,ac-3",RESOLUTION=1280x720
 ,FRAME-RATE=60.000,CLOSED-CAPTIONS="cc1",AUDIO="aud2",SUBTITLES="sub1"
 v6/prog_index.m3u8
 #EXT-X-STREAM-INF:AVERAGE-
 BANDWIDTH=1514303,BANDWIDTH=1518366,CODECS="avc1.64001e,ac-3",RESOLUTION=768x432
 ,FRAME-RATE=30.000,CLOSED-CAPTIONS="cc1",AUDIO="aud2",SUBTITLES="sub1"
 v4/prog_index.m3u8
 #EXT-X-STREAM-INF:AVERAGE-
 BANDWIDTH=1136099,BANDWIDTH=1143619,CODECS="avc1.64001e,ac-3",RESOLUTION=640x360
 ,FRAME-RATE=30.000,CLOSED-CAPTIONS="cc1",AUDIO="aud2",SUBTITLES="sub1"
 v3/prog_index.m3u8
 #EXT-X-STREAM-INF:AVERAGE-
 BANDWIDTH=762616,BANDWIDTH=774387,CODECS="avc1.640015,ac-3",RESOLUTION=480x270
 ,FRAME-RATE=30.000,CLOSED-CAPTIONS="cc1",AUDIO="aud2",SUBTITLES="sub1"
 v2/prog_index.m3u8

 #EXT-X-STREAM-INF:AVERAGE-
 BANDWIDTH=2247704,BANDWIDTH=2256841,CODECS="avc1.640020,ec-3",RESOLUTION=960x540
 ,FRAME-RATE=60.000,CLOSED-CAPTIONS="cc1",AUDIO="aud3",SUBTITLES="sub1"
 v5/prog_index.m3u8
 #EXT-X-STREAM-INF:AVERAGE-
 BANDWIDTH=8174033,BANDWIDTH=8207417,CODECS="avc1.64002a,ec-3",RESOLUTION=1920x1080
 ,FRAME-RATE=60.000,CLOSED-CAPTIONS="cc1",AUDIO="aud3",SUBTITLES="sub1"
 v9/prog_index.m3u8
 #EXT-X-STREAM-INF:AVERAGE-
 BANDWIDTH=6336521,BANDWIDTH=6482579,CODECS="avc1.64002a,ec-3",RESOLUTION=1920x1080
 ,FRAME-RATE=60.000,CLOSED-CAPTIONS="cc1",AUDIO="aud3",SUBTITLES="sub1"
 v8/prog_index.m3u8
 #EXT-X-STREAM-INF:AVERAGE-
 BANDWIDTH=4804715,BANDWIDTH=5083609,CODECS="avc1.64002a,ec-3",RESOLUTION=1920x1080
 ,FRAME-RATE=60.000,CLOSED-CAPTIONS="cc1",AUDIO="aud3",SUBTITLES="sub1"
 v7/prog_index.m3u8
 #EXT-X-STREAM-INF:AVERAGE-
 BANDWIDTH=3269973,BANDWIDTH=3318665,CODECS="avc1.640020,ec-3",RESOLUTION=1280x720
 ,FRAME-RATE=60.000,CLOSED-CAPTIONS="cc1",AUDIO="aud3",SUBTITLES="sub1"
 v6/prog_index.m3u8
 #EXT-X-STREAM-INF:AVERAGE-
 BANDWIDTH=1322303,BANDWIDTH=1326366,CODECS="avc1.64001e,ec-3",RESOLUTION=768x432
 ,FRAME-RATE=30.000,CLOSED-CAPTIONS="cc1",AUDIO="aud3",SUBTITLES="sub1"
 v4/prog_index.m3u8
 #EXT-X-STREAM-INF:AVERAGE-
 BANDWIDTH=944099,BANDWIDTH=951619,CODECS="avc1.64001e,ec-3",RESOLUTION=640x360
 ,FRAME-RATE=30.000,CLOSED-CAPTIONS="cc1",AUDIO="aud3",SUBTITLES="sub1"
 v3/prog_index.m3u8
 #EXT-X-STREAM-INF:AVERAGE-
 BANDWIDTH=570616,BANDWIDTH=582387,CODECS="avc1.640015,ec-3",RESOLUTION=480x270
 ,FRAME-RATE=30.000,CLOSED-CAPTIONS="cc1",AUDIO="aud3",SUBTITLES="sub1"
 v2/prog_index.m3u8

 #EXT-X-I-FRAME-STREAM-INF:AVERAGE-
 BANDWIDTH=182077,BANDWIDTH=186522,CODECS="avc1.64002a",RESOLUTION=1920x1080,URI="v7/iframe_index.m3u8"
 #EXT-X-I-FRAME-STREAM-INF:AVERAGE-
 BANDWIDTH=129936,BANDWIDTH=133856,CODECS="avc1.640020",RESOLUTION=1280x720,URI="v6/iframe_index.m3u8"
 #EXT-X-I-FRAME-STREAM-INF:AVERAGE-
 BANDWIDTH=94286,BANDWIDTH=98136,CODECS="avc1.640020",RESOLUTION=960x540,URI="v5/iframe_index.m3u8"
 #EXT-X-I-FRAME-STREAM-INF:AVERAGE-
 BANDWIDTH=74767,BANDWIDTH=76704,CODECS="avc1.64001e",RESOLUTION=768x432,URI="v4/iframe_index.m3u8"
 #EXT-X-I-FRAME-STREAM-INF:AVERAGE-
 BANDWIDTH=62251,BANDWIDTH=64078,CODECS="avc1.64001e",RESOLUTION=640x360,URI="v3/iframe_index.m3u8"
 #EXT-X-I-FRAME-STREAM-INF:AVERAGE-
 BANDWIDTH=37866,BANDWIDTH=38728,CODECS="avc1.640015",RESOLUTION=480x270,URI="v2/iframe_index.m3u8"

 #EXT-X-MEDIA:TYPE=AUDIO,GROUP-
 ID="aud1",LANGUAGE="en",NAME="English",AUTOSELECT=YES,DEFAULT=YES,CHANNELS="2",URI="a1/prog_index.m3u8"
 #EXT-X-MEDIA:TYPE=AUDIO,GROUP-
 ID="aud2",LANGUAGE="en",NAME="English",AUTOSELECT=YES,DEFAULT=YES,CHANNELS="6",URI="a2/prog_index.m3u8"
 #EXT-X-MEDIA:TYPE=AUDIO,GROUP-
 ID="aud3",LANGUAGE="en",NAME="English",AUTOSELECT=YES,DEFAULT=YES,CHANNELS="6",URI="a3/prog_index.m3u8"

 #EXT-X-MEDIA:TYPE=CLOSED-CAPTIONS,GROUP-
 ID="cc1",LANGUAGE="en",NAME="English",AUTOSELECT=YES,DEFAULT=YES,INSTREAM-
 ID="CC1"

 #EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-
 ID="sub1",LANGUAGE="en",NAME="English",AUTOSELECT=YES,DEFAULT=YES,FORCED=NO,URI="s1/en/prog_index.m3u8"
 }}}

 Now here is the first video playlist content :
 https://devstreaming-
 cdn.apple.com/videos/streaming/examples/img_bipbop_adv_example_ts/v5/prog_index.m3u8


 {{{
 #EXTM3U
 #EXT-X-TARGETDURATION:6
 #EXT-X-VERSION:3
 #EXT-X-MEDIA-SEQUENCE:0
 #EXT-X-PLAYLIST-TYPE:VOD
 #EXT-X-INDEPENDENT-SEGMENTS
 #EXTINF:6.00000,
 #EXT-X-BITRATE:2060
 fileSequence0.ts
 #EXTINF:6.00000,
 #EXT-X-BITRATE:2063
 fileSequence1.ts
 #EXTINF:6.00000,
 #EXT-X-BITRATE:2056
 fileSequence2.ts
 #EXTINF:6.00000,
 #EXT-X-BITRATE:2055
 fileSequence3.ts
 #EXTINF:6.00000,
 #EXT-X-BITRATE:2056
 fileSequence4.ts
 #EXTINF:6.00000,
 #EXT-X-BITRATE:2051
 fileSequence5.ts
 #EXTINF:6.00000,
 #EXT-X-BITRATE:2055
 fileSequence6.ts
 #EXTINF:6.00000,
 #EXT-X-BITRATE:2060
 fileSequence7.ts
 #EXTINF:6.00000,
 #EXT-X-BITRATE:2050
 fileSequence8.ts
 ...
 #EXTINF:6.00000,
 #EXT-X-BITRATE:2063
 fileSequence95.ts
 #EXTINF:6.00000,
 #EXT-X-BITRATE:2056
 fileSequence96.ts
 #EXTINF:6.00000,
 #EXT-X-BITRATE:2048
 fileSequence97.ts
 #EXTINF:6.00000,
 #EXT-X-BITRATE:2063
 fileSequence98.ts
 #EXTINF:6.00000,
 #EXT-X-BITRATE:2055
 fileSequence99.ts
 #EXT-X-ENDLIST
 }}}

 We can see the #EXT-X-TARGETDURATION value is 6 seconds.
 And the #EXTINF value for each segment is exactly 6.00000.

 Dashenc and Hlsenc segmenters can produce exactly the same result via
 FFMPEG.
 That's perfect.

 And now here is the first audio playlist content :
 https://devstreaming-
 cdn.apple.com/videos/streaming/examples/img_bipbop_adv_example_ts/a1/prog_index.m3u8

 {{{
 #EXTM3U
 #EXT-X-TARGETDURATION:6
 #EXT-X-VERSION:3
 #EXT-X-MEDIA-SEQUENCE:0
 #EXT-X-PLAYLIST-TYPE:VOD
 #EXT-X-INDEPENDENT-SEGMENTS
 #EXTINF:5.99467,
 #EXT-X-BITRATE:163
 fileSequence0.aac
 #EXTINF:5.99467,
 #EXT-X-BITRATE:163
 fileSequence1.aac
 #EXTINF:5.99467,
 #EXT-X-BITRATE:163
 fileSequence2.aac
 #EXTINF:5.99467,
 #EXT-X-BITRATE:163
 fileSequence3.aac
 #EXTINF:5.99467,
 #EXT-X-BITRATE:163
 fileSequence4.aac
 #EXTINF:5.99467,
 #EXT-X-BITRATE:163
 fileSequence5.aac
 #EXTINF:5.99467,
 #EXT-X-BITRATE:163
 fileSequence6.aac
 #EXTINF:5.99467,
 #EXT-X-BITRATE:163
 fileSequence7.aac
 #EXTINF:5.99467,
 #EXT-X-BITRATE:163
 fileSequence8.aac
 ...
 #EXTINF:5.99467,
 #EXT-X-BITRATE:163
 fileSequence95.aac
 #EXTINF:5.99467,
 #EXT-X-BITRATE:163
 fileSequence96.aac
 #EXTINF:5.99467,
 #EXT-X-BITRATE:163
 fileSequence97.aac
 #EXTINF:5.99467,
 #EXT-X-BITRATE:163
 fileSequence98.aac
 #EXTINF:5.99467,
 #EXT-X-BITRATE:163
 fileSequence99.aac
 #EXTINF:0.57600,
 #EXT-X-BITRATE:164
 fileSequence100.aac
 #EXT-X-ENDLIST
 }}}

 We can see the #EXT-X-TARGETDURATION value is 6 seconds.
 The same value as the video playlist.

 And the #EXTINF value of each segment is always 5.99467.
 This value is realy near of 6.000000 and always lower than 6.000000

 So let's see the second audio playlist content :
 https://devstreaming-
 cdn.apple.com/videos/streaming/examples/img_bipbop_adv_example_ts/a2/prog_index.m3u8

 {{{
 #EXTM3U
 #EXT-X-TARGETDURATION:6
 #EXT-X-VERSION:3
 #EXT-X-MEDIA-SEQUENCE:0
 #EXT-X-PLAYLIST-TYPE:VOD
 #EXT-X-INDEPENDENT-SEGMENTS
 #EXTINF:5.98400,
 #EXT-X-BITRATE:384
 fileSequence0.ac3
 #EXTINF:5.98400,
 #EXT-X-BITRATE:384
 fileSequence1.ac3
 #EXTINF:5.98400,
 #EXT-X-BITRATE:384
 fileSequence2.ac3
 #EXTINF:5.98400,
 #EXT-X-BITRATE:384
 fileSequence3.ac3
 #EXTINF:5.98400,
 #EXT-X-BITRATE:384
 fileSequence4.ac3
 #EXTINF:5.98400,
 #EXT-X-BITRATE:384
 fileSequence5.ac3
 #EXTINF:5.98400,
 #EXT-X-BITRATE:384
 fileSequence6.ac3
 #EXTINF:5.98400,
 #EXT-X-BITRATE:384
 fileSequence7.ac3
 ...
 #EXTINF:5.98400,
 #EXT-X-BITRATE:384
 fileSequence95.ac3
 #EXTINF:5.98400,
 #EXT-X-BITRATE:384
 fileSequence96.ac3
 #EXTINF:5.98400,
 #EXT-X-BITRATE:384
 fileSequence97.ac3
 #EXTINF:5.98400,
 #EXT-X-BITRATE:384
 fileSequence98.ac3
 #EXTINF:5.98400,
 #EXT-X-BITRATE:384
 fileSequence99.ac3
 #EXTINF:1.60000,
 #EXT-X-BITRATE:384
 fileSequence100.ac3
 #EXT-X-ENDLIST
 }}}

 We can see the #EXT-X-TARGETDURATION value is 6 seconds.
 The same value as the video playlist.
 And the same value as the first audio playlist.

 And the #EXTINF value of each segment is always 5.98400.
 This value is realy near of 6.000000 and always lower than 6.000000.
 But it's not the same duration as the segments in the first audio
 playlist.

 This means to be absolutely compliant with the RFC 8216 the segmenter
 should be able to cut the audio stream few milliseconds before the
 expected segment duration. But I don't know if this is possible with
 Dashenc and/or Hlsenc. Their source code isn't easy for me.

--
Ticket URL: <https://trac.ffmpeg.org/ticket/6915#comment:39>
FFmpeg <https://ffmpeg.org>
FFmpeg issue tracker


More information about the FFmpeg-trac mailing list