MPEG-DASH Support in Silverlight

Oct 21, 2013 at 4:03 PM
Can anyone provide some status update on the integration of MPEG-DASH support in Silverlight?

Nov 15, 2013 at 4:39 PM
wondering too what the state is - I see they do work on Javascript and Flash (Strobe plugin), but no Silverlight?
see plugins, has Microsoft Adaptive Streaming Plugin there

"Dash.js is permissively licensed (under the BSD license) and can therefore be studied and reused by anyone seeking to provide their own DASH-AVC/264 compliant player. The goal is to make it easier for third-parties to build adaptive streaming video players. "
Mar 22, 2014 at 5:36 AM
The latest Smooth Streaming Client SDK version 2.5 now supports MPEG-DASH:
Mar 23, 2014 at 1:13 AM
Edited Mar 23, 2014 at 3:58 AM
thanks for the good news

does this mean I just need to install Smooth Streaming Client SDK and rebuild ClipFlair Studio ( to consume MPEG-DASH urls at the Clip component (uses SMF) in ?

fingers crossed, will try it out asap

then next missing puzzle is how to wrap smooth streams as mpeg-dash with iis/transform manager in cases where encoding on azure is not an option
Mar 23, 2014 at 1:33 AM
Edited Mar 23, 2014 at 1:33 AM
Yes, the new version of the Smooth Streaming Client SDK should just work with existing SMF projects. You should then be able to consume MPEG-DASH manifests without any code changes.
Mar 23, 2014 at 3:46 AM
Edited Mar 23, 2014 at 3:47 AM
I noticed when installing the Smooth Streaming Client SDK 2.5, the 2.0 also remains installed on Windows Server 2008 R2

It kept on pulling the old Microsoft.Web.MediaStreaming.dll into the .xap file, although I had removed the old reference to it and added a new one. Then after uninstalling the 2.0 client it stopped pulling the old dll into the xap, but didn't pull the new one. I ended up added the reference not only to the MediaPlayer.Silverlight I have at ClipFlair, but also to the ClipFlair.Windows.Media project (a FloatingWindow that wraps the MediaPlayer component) and eventually to the ClipFlair.Studio.Silverlight project (the main app of since it was still not pulling the .dll into the .XAP

So now our Clip component supports MPEG-DASH streams like:
(haven't found any other samples ending in .ism/manifest(format=mpd-time-csf) with a google search)

HOWEVER, I haven't found a way to play .mpd files like:
althouth I see the file extension mentioned at:
Mar 23, 2014 at 3:47 AM
they look similar, eg this plays: <?xml version="1.0" encoding="utf-8"?> <MPD xmlns="urn:mpeg:dash:schema:mpd:2011" xmlns:xsi="" profiles="urn:mpeg:dash:profile:isoff-live:2011" type="static" mediaPresentationDuration="PT52.250S" minBufferTime="PT4S"><Period><AdaptationSet id="1" group="5" profiles="ccff" bitstreamSwitching="true" segmentAlignment="true" contentType="audio" mimeType="audio/mp4" codecs="mp4a.40.2" lang="en"><SegmentTemplate timescale="10000000" media="QualityLevels($Bandwidth$)/Fragments(audio_eng=$Time$,format=mpd-time-csf)" initialization="QualityLevels($Bandwidth$)/Fragments(audio_eng=i,format=mpd-time-csf)"><SegmentTimeline><S d="20201360"/><S d="20201361"/><S d="20201360"/><S d="20201361"/><S d="20201360"/><S d="20201361"/><S d="20201360"/><S d="20201134"/><S d="20201361"/><S d="20201360"/><S d="20201361"/><S d="20201134"/><S d="20201360"/><S d="20201361"/><S d="20201360"/><S d="20201361"/><S d="20201133"/><S d="20201361" r="1"/><S d="20201360"/><S d="20201361"/><S d="20201133"/><S d="20201361" r="1"/><S d="20201360"/><S d="17414966"/></SegmentTimeline></SegmentTemplate><Representation id="5_A1_audio_eng" bandwidth="125576" audioSamplingRate="44100"/></AdaptationSet><AdaptationSet id="2" group="1" profiles="ccff" bitstreamSwitching="true" segmentAlignment="true" contentType="video" mimeType="video/mp4" codecs="avc1.640028" maxWidth="1920" maxHeight="1080" startWithSAP="1"><SegmentTemplate timescale="10000000" media="QualityLevels($Bandwidth$)/Fragments(video=$Time$,format=mpd-time-csf)" initialization="QualityLevels($Bandwidth$)/Fragments(video=i,format=mpd-time-csf)"><SegmentTimeline><S d="20000000" r="18"/><S d="39999583"/><S d="20000000" r="4"/><S d="2500000"/></SegmentTimeline></SegmentTemplate><Representation id="1_V1_video" bandwidth="5933486" width="1920" height="1080"/><Representation id="1_V2_video" bandwidth="4646861" width="1920" height="1080"/><Representation id="1_V3_video" bandwidth="3360441" width="1280" height="720"/><Representation id="1_V4_video" bandwidth="2222352" width="960" height="540"/><Representation id="1_V5_video" bandwidth="1480106" width="960" height="540"/><Representation id="1_V6_video" bandwidth="985321" width="640" height="360"/><Representation id="1_V7_video" bandwidth="638937" width="640" height="360"/><Representation id="1_V8_video" bandwidth="391544" width="320" height="180"/></AdaptationSet></Period></MPD>
Mar 23, 2014 at 3:47 AM
but this doesn't:

<?xml version="1.0" encoding="UTF-8"?>
<MPD type="static" xmlns="urn:mpeg:DASH:schema:MPD:2011" profiles="urn:mpeg:dash:profile:isoff-live:2011" minBufferTime="PT1.11S" mediaPresentationDuration="PT9M32.560S">
<!-- MPEG DASH ISO BMFF test stream with avc3 and common initialisation segments --> <!-- BBC Research & Development --> <!-- For more information see --> <ProgramInformation>
<Title>Adaptive Bitrate Test Stream from BBC Research and Development - Full stream with common initialisation segments</Title>
<Source>BBC Research and Development</Source>
<Period duration="PT9M32.560S">
<AdaptationSet startWithSAP="2" segmentAlignment="true" id="1" scanType="progressive" mimeType="video/mp4" >
    <ContentComponent id="1" contentType="video" />
    <SegmentTemplate startNumber="1" timescale="1000" duration="3840" media="$RepresentationID$/$Number$" initialization="V5.mp4/IS" />
    <Representation id="V1.mp4" codecs="avc3.4d4015" height="288" width="512" bandwidth="356296" />
    <Representation id="V2.mp4" codecs="avc3.4d401e" height="396" width="704" bandwidth="619088" />
    <Representation id="V3.mp4" codecs="avc3.64001f" height="504" width="896" bandwidth="1330608" />
    <Representation id="V4.mp4" codecs="avc3.640020" height="720" width="1280" bandwidth="2501216" />
    <Representation id="V5.mp4" codecs="avc3.640028" height="1080" width="1920" bandwidth="4487408" />
<AdaptationSet startWithSAP="2" segmentAlignment="true" id="2" audioSamplingRate="48000" lang="eng" mimeType="audio/mp4" >
    <AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
    <ContentComponent id="1" contentType="audio" lang="eng"/>
    <SegmentTemplate startNumber="1" timescale="1000" duration="3840" media="$RepresentationID$/$Number$" initialization="A2-aud.mp4/IS" />
    <Representation id="A2-aud.mp4" codecs="mp4a.40.2" bandwidth="95792" />
    <Representation id="A3-aud.mp4" codecs="mp4a.40.2" bandwidth="127800" />
    <Representation id="A4-aud.mp4" codecs="mp4a.40.2" bandwidth="159816" />
Mar 23, 2014 at 3:48 AM
neither this one:

<MPD xmlns="urn:mpeg:DASH:schema:MPD:2011" mediaPresentationDuration="PT0H3M1.63S" minBufferTime="PT1.5S" profiles="urn:mpeg:dash:profile:isoff-on-demand:2011"
<Period duration="PT0H3M1.63S" start="PT0S">
  <ContentComponent contentType="video" id="1" />
  <Representation bandwidth="4190760" codecs="avc1.640028" height="1080" id="1" mimeType="video/mp4" width="1920">
    <SegmentBase indexRange="674-1149">
      <Initialization range="0-673" />
  <Representation bandwidth="2073921" codecs="avc1.4d401f" height="720" id="2" mimeType="video/mp4" width="1280">
    <SegmentBase indexRange="708-1183">
      <Initialization range="0-707" />
  <Representation bandwidth="869460" codecs="avc1.4d401e" height="480" id="3" mimeType="video/mp4" width="854">
    <SegmentBase indexRange="708-1183">
      <Initialization range="0-707" />
  <Representation bandwidth="686521" codecs="avc1.4d401e" height="360" id="4" mimeType="video/mp4" width="640">
    <SegmentBase indexRange="708-1183">
      <Initialization range="0-707" />
  <Representation bandwidth="264835" codecs="avc1.4d4015" height="240" id="5" mimeType="video/mp4" width="426">
    <SegmentBase indexRange="672-1147">
      <Initialization range="0-671" />
  <Representation bandwidth="100000" codecs="avc1.4d4015" height="144" id="5" mimeType="video/mp4" width="256">
    <SegmentBase indexRange="671-1146">
      <Initialization range="0-670" />
  <ContentComponent contentType="audio" id="2" />
  <Representation bandwidth="127236" codecs="mp4a.40.2" id="6" mimeType="audio/mp4" numChannels="2" sampleRate="44100">
    <SegmentBase indexRange="592-851">
      <Initialization range="0-591" />
  <Representation bandwidth="255236" codecs="mp4a.40.2" id="7" mimeType="audio/mp4" numChannels="2" sampleRate="44100">
    <SegmentBase indexRange="592-851">
      <Initialization range="0-591" />
  <Representation bandwidth="31749" codecs="mp4a.40.5" id="8" mimeType="audio/mp4" numChannels="1" sampleRate="22050">
    <SegmentBase indexRange="592-851">
      <Initialization range="0-591" />
Mar 23, 2014 at 3:50 AM
a common pattern I see with a quick look at those failing is that they use attributes at Period XML tag (but of course that's just a wild guess)
Mar 23, 2014 at 4:01 AM
Edited Mar 23, 2014 at 4:01 AM
btw, I needed a code change to check the url ending since I want to consume both ProgressiveDownload and AdaptiveStreaming URLs. Is there any way SMF can autodetect the type of the content itself. My code at Client/Media/MediaPlayer.Silverlight project in is:
    /// <summary>
    /// Provides derived classes an opportunity to handle changes to the Source property.
    /// </summary>
    protected virtual void OnSourceChanged(Uri oldSource, Uri newSource)
      if (newSource == null || newSource.AbsoluteUri == "")
        Playlist.Clear(); //giving an empty source clears the current playlist (this will also stop any current playback)

      PlaylistItem playlistItem = new PlaylistItem();

      //playlistItem.StartPosition = ... //TODO: see newSource.Fragment and accept Media URIs here to jump directly to time position? (Stop action should maybe also then go there, plus ignore Time value at state load)

      //Set URL//

      string newSourceStr = FixURL(newSource.AbsoluteUri);

      playlistItem.MediaSource = new Uri(newSourceStr);

      string s;
      if (newSourceStr.EndsWith(".ism/manifest", StringComparison.OrdinalIgnoreCase)) //Smooth stream
        playlistItem.DeliveryMethod = DeliveryMethods.AdaptiveStreaming;
        s = newSourceStr.Substring(0, newSourceStr.Length - 13); //".ism/manifest" suffix is 13 chars long (not using Replace method since it doesn't take StringComparison parameter)
      else if (newSourceStr.EndsWith(".ism/manifest(format=mpd-time-csf)", StringComparison.OrdinalIgnoreCase)) //MPEG-DASH (this works)
        playlistItem.DeliveryMethod = DeliveryMethods.AdaptiveStreaming;
        s = newSourceStr.Substring(0, newSourceStr.Length - 34); //".ism/manifest(format=mpd-time-csf)" suffix is 34 chars long (not using Replace method since it doesn't take StringComparison parameter)
      else if (newSourceStr.EndsWith(".mpd", StringComparison.OrdinalIgnoreCase)) //MPEG-DASH (this doesn't seem to work) //TODO: check if server needs to have some MIME type to serve this or client access policy file
        playlistItem.DeliveryMethod = DeliveryMethods.AdaptiveStreaming;
        s = newSourceStr.Substring(0, newSourceStr.Length - 4); //".mpd" suffix is 4 chars long (not using Replace method since it doesn't take StringComparison parameter)
        playlistItem.DeliveryMethod = DeliveryMethods.ProgressiveDownload; //TODO: maybe this should be "Streaming"?
        string ss = newSourceStr.Split('.').Last();
        s = newSourceStr.Substring(0, newSourceStr.Length - ss.Length - 1); //-1 to remove the dot too

      //Set title//
      playlistItem.Title = new Uri(s).GetComponents(UriComponents.Path, UriFormat.Unescaped).Split('/').Last();

      //Set thumbnail//
      playlistItem.ThumbSource = new Uri(s + "_Thumb.jpg"); //TODO: YouTube uses URL of the form "" (and 1.jpg for smaller thumb)

            List<MarkerResource> markerResources = new List<MarkerResource>();
            MarkerResource markerResource = new MarkerResource();
            markerResource.Source = new Uri("ExampleCaptions.xml", UriKind.Relative); //TODO: change
            playlistItem.MarkerResources = markerResources;

Mar 23, 2014 at 6:13 AM
MPD files are no different from a client perspective and should play just fine, for example:

There are known limitations in the Smooth Streaming Client implementation for Silverlight listed on the download page that seem more likely to be causing the failures you're seeing:
  • Dynamic MPD types are not supported.
  • Multiple Periods are not supported in an MPD.
  • The EMSG box is not supported.
  • The codec and content limitations that apply to Smooth similarly apply to DASH. (see
  • Trick play is not supported. Playback rate must be 1.
  • Multiplexed streams are not supported.
Mar 23, 2014 at 2:21 PM
it doesn't play the .mpd link you posted either

I'm telling it to use adaptive streaming plugin if it sees .mpd suffix in the url. Should I tell it to use progressive download plugin instead?

also, apart from the dll being 300k bigger or something it seems it takes long time to load the library the 1st time (didn't use to have this issue)
Mar 23, 2014 at 2:33 PM
in fact the startup delay introduced seems to be so big that I'm considering rolling back to Smooth Streaming Client SDK 2.0 for the time being and lose MPEG-DASH support
Mar 24, 2014 at 1:09 PM
good news: seems the startup delay was occuring only on my PC, had seen some message recently that "Multimedia library was corrupted" and the Media Player FixIt utility couldn't fix it so I had uninstalled Windows Media Player and Media Center (it's Win7 ultimate) and maybe that was causing the issue. After installing them again it seems to instantiate a bit faster the 1st time (at least half the delay than before). Also, I'm building in Debug mode (have some issues with Release mode not pulling all Dlls in the Silverlight .xap), not sure if building in Release mode would make it come up faster
Mar 25, 2014 at 8:55 PM
I can confirm that the following DASH streams from the DASH-JS player all play properly with the Smooth Streaming Client SDK. I would venture a guess that any of these not playing in your app would be specific to your app or SMF's usage of the Smooth Streaming Client SDK, not with the SDK itself.
Mar 25, 2014 at 10:13 PM
I find this one to play fine in ClipFlair Studio's Clip component:
whereas the rest I found at
do not play

I will try the ones you posted too
Mar 25, 2014 at 10:16 PM
one can use ClipFlair Studio's Clip component to test SMF's use of Smooth Streaming Client SDK (you go to, press Cancel [to not open the tutorial activity], then add a Clip component from the activity toolbar at the bottom, then press the wrench button on the Clip component titlebar to flip it over and paste the media url, then flip back to front - in fact pasting the URL and pressing tab should show the Time property flowing so you don't even need to flip back to the display to see if something plays or not)

Mar 25, 2014 at 10:45 PM
Edited Mar 25, 2014 at 11:13 PM
--- from your list, these play:

--- these play, but seem to take some more time to startup (only the 1st time, guess they get cached and play faster the next time):

--- these also take some time to startup
also, for these I did the trick of adding the DUMMY suffix &ext=.mpd to make our player pass it to AdaptiveStreaming plugin of SMF instead of ProgressiveDownload plugin (we need to support both those transparently [there doesn't seem to exist some way for SMF to pick the right plugin automatically] for the user who often don't understand the difference of remote files vs streams):

--- all the rest don't seem to play:
Mar 25, 2014 at 11:12 PM
it says:
  • Multiple movie fragments will be addressed in a single chunk such that all but the last chunk will have a duration greater than or equal to this property. For examples of how to set Playback Settings see the Smooth documentation.
could that be related to those .mpd playing in Smooth Streaming Client SDK 2.5 (as you confirm), but not in ClipFlair Studio that use SMF's AdaptiveStreamingPlugin with Smooth Streaming Client SDK 2.5?

the text of that phrase is a bit cryptic to me (what does "to this property" refer to? also, what does "set Playback Settings" mean? what exactly do you need to set regarding the "multiple movie fragments"?)
Apr 4, 2014 at 6:37 PM
The MinByteRangeChunkLengthSeconds property has nothing to do with the issue you're seeing. In byte-range addressed content, this property will influence the duration of the requested chunk lengths to optimize HTTP traffic from the server. If the stream's chunk length is short (e.g. less than one second), setting this property to a larger value (e.g. two seconds) will batch up HTTP requests to the server for more efficient downloads.

A lot of the DASH content test servers don't support Silverlight clients properly which is probably causing the issues you're seeing. Until they update their servers, you can work around the issue by using Fiddler to inject a client access policy XML response from the server. You can either capture a client access policy XML file from another server for this purpose or just write one yourself.
Apr 4, 2014 at 7:05 PM
thanks for the info, I thought MediaElement and Image controls don't need client access policy by design in Silverlight (else I wouldn't be able to play a progressive download video from dropbox with SMF as I can do now in ClipFlair Studio's Clip component (Dropbox doesn't provide such policy files from what I had checked in the past (eg I can't load text files from there with Silverlight).

client access policy is sad story, since with proxies it could be bypassed (but don't want to reroute everything the rich client app consumes through our server and choke it)

could it be a mime type issue with .mpd on those servers?