DASH manifest improperly formatted?
I’m experimenting with DASH streams, and EMS seems to create them no problem, but they won’t play in DASH players. I notice that the format of the .mpd file generated by EMS is drastically different from publicly available .mpd files, with many fields missing. Is there a way to configure the format of the .mpd file created by EMS? The EMS manifest does not seem to conform to the structure shown here.
Here is an example of a publicly available DASH manifest:
<?xml version="1.0" encoding="UTF-8"?>And here is one generated by EMS:
<MPD xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="urn:mpeg:dash:schema:mpd:2011"
xsi:schemaLocation="urn:mpeg:dash:schema:mpd:2011 DASH-MPD.xsd"
type="static"
mediaPresentationDuration="PT654S"
minBufferTime="PT4S"
profiles="http://dashif.org/guidelines/dash264,urn:mpeg:dash:profile:isoff-on-demand:2011">
<BaseURL>http://dash.edgesuite.net/dash264/TestCases/1a/netflix/</BaseURL>
<Period>
<!-- English Audio -->
<AdaptationSet mimeType="audio/mp4" codecs="mp4a.40.5" lang="en" subsegmentAlignment="true" subsegmentStartsWithSAP="1">
<Representation id="1" bandwidth="72000">
<BaseURL>ElephantsDream_AAC48K_064.mp4.dash</BaseURL>
</Representation>
</AdaptationSet>
<!-- Video -->
<AdaptationSet mimeType="video/mp4" codecs="avc1.42401E" subsegmentAlignment="true" subsegmentStartsWithSAP="1" contentType='video' par="4:3">
<Representation id="2" bandwidth="150000" width="480" height="360" frameRate="24" sar="1:1">
<BaseURL>ElephantsDream_H264BPL30_0100.264.dash</BaseURL>
</Representation>
<Representation id="3" bandwidth="250000" width="480" height="360" frameRate="24" sar="1:1">
<BaseURL>ElephantsDream_H264BPL30_0175.264.dash</BaseURL>
</Representation>
<Representation id="4" bandwidth="350000" width="480" height="360" frameRate="24" sar="1:1">
<BaseURL>ElephantsDream_H264BPL30_0250.264.dash</BaseURL>
</Representation>
<Representation id="5" bandwidth="750000" width="480" height="360" frameRate="24" sar="1:1">
<BaseURL>ElephantsDream_H264BPL30_0500.264.dash</BaseURL>
</Representation>
</AdaptationSet>
</Period>
</MPD>
<?xml version="1.0" encoding="utf-8"?>You can see the difference fairly easily (no BaseURL field, some Representation attributes are in AdaptationSet, etc). I have no idea if the differences are significant, but the first DASH stream plays in my browser, no problem, while the EMS DASH stream does not. It shows the “Video format or MIME type is not supported” error message on top of the player.
<MPD
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="urn:mpeg:DASH:schema:MPD:2011"
type="static"
xmlns="urn:mpeg:dash:schema:mpd:2011"
profiles="urn:mpeg:dash:profile:isoff-main:2011"
mediaPresentationDuration="PT31.296S"
minBufferTime="PT10S">
<Period duration="PT31.296S" id="evo-dash" start="PT0S">
<AdaptationSet maxFrameRate="3000" maxHeight="1080" maxWidth="1920" par="16:9" segmentAlignment="true" startWithSAP="0">
<ContentComponent contentType="video" id="1"/>
<Representation bandwidth="72000" codecs="avc1.42c01e" frameRate="37" height="480" id="testStream01bbbVideo72000" mimeType="video/mp4" sar="1:1" width="854">
<SegmentList duration="10000" timescale="1000">
<Initialization sourceURL="testStream01bbb/video/72000/seg_init.mp4"/>
<SegmentURL media="testStream01bbb/video/72000/segment_0.m4s"/>
<SegmentURL media="testStream01bbb/video/72000/segment_10417.m4s"/>
<SegmentURL media="testStream01bbb/video/72000/segment_20833.m4s"/>
</SegmentList>
</Representation>
</AdaptationSet>
<AdaptationSet lang="en" segmentAlignment="true" startWithSAP="0">
<ContentComponent contentType="audio" id="2"/>
<Representation audioSamplingRate="48000" bandwidth="72000" codecs="mp4a.40.2" id="testStream01bbbAudio72000" mimeType="audio/mp4">
<AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
<SegmentList duration="10000" timescale="1000">
<Initialization sourceURL="testStream01bbb/audio/72000/seg_init.mp4"/>
<SegmentURL media="testStream01bbb/audio/72000/segment_0.m4s"/>
<SegmentURL media="testStream01bbb/audio/72000/segment_10432.m4s"/>
<SegmentURL media="testStream01bbb/audio/72000/segment_20864.m4s"/>
</SegmentList>
</Representation>
</AdaptationSet>
</Period>
</MPD>
2 Answers
Making use of some dude’s blog as a reference for manifest structure is not a very reliable one, don’t you think? Nothing against that by the way, the manifest in the blog is just one of the many types of manifests.
Anyway, There are many formats of DASH manifest, not just one. Evostream uses 2 types, for live streaming it uses SegmentTemplate timeline manifest, while for on demand, it uses SegmentList which is what you posted here. There are more types of manifest for example the SegmentTemplate number based manifest (supports live and on-demand) and the SegmentBase and BaseURL manifest which only supports on demand, this is what the dude is presenting in the blog you referenced here.
The best place to confirm this Manifest types is of-course in the DASH specs ISO/IEC 23009-1 (http://standards.iso.org/ittf/PubliclyAvailableStandards/c065274_ISO_IEC_23009-1_2014.zip).
Also, we have customers using DASH and it worked perfectly on modern DASH players out there. DASH is a standard and its development is being steered by the DASH-IF consortium (http://dashif.org/members/). And they have a reference player which you can try (http://dashif.org/reference/players/javascript/v2.3.0/samples/dash-if-reference-player/index.html), they also have a tool that you can use to validate if the manifest is valid or invalid, check it here ( http://dashif.org/conformance.html), ITEC also has their own validator (http://www-itec.uni-klu.ac.at/dash/?page_id=605)
Some suggestions for modern players:
- Bitdash – http://bitmovin.com/hls-mpeg-dash-test-player/
- Akamai – http://players.akamai.com/dash/
- Dash-IF – http://dashif.org/reference/players/javascript/v2.3.0/samples/dash-if-reference-player/index.html