[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