{"id":728,"date":"2020-10-22T07:50:00","date_gmt":"2020-10-22T05:50:00","guid":{"rendered":"https:\/\/websites.fraunhofer.de\/video-dev\/?p=728"},"modified":"2020-10-22T07:51:16","modified_gmt":"2020-10-22T05:51:16","slug":"common-pitfalls-in-mpeg-dash-streaming","status":"publish","type":"post","link":"https:\/\/websites.fraunhofer.de\/video-dev\/common-pitfalls-in-mpeg-dash-streaming\/","title":{"rendered":"Common pitfalls in MPEG-DASH streaming"},"content":{"rendered":"\n<p>As head developers of the <a rel=\"noreferrer noopener\" href=\"https:\/\/github.com\/Dash-Industry-Forum\/dash.js\" target=\"_blank\">dash.js<\/a> project we are frequently facing situations in which we have to evaluate if the failure of a DASH stream is caused by an actual bug in the implementation of the dash.js player or by wrong content authoring. In this blog post we share some common mistakes in DASH streams. Moreover, we give an insight on what we typically look for in problematic streams.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">DRM specific pitfalls<\/h2>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p>Stay safe, use https<\/p><\/blockquote>\n\n\n\n<p>A very common mistake in the context of playing DRM protected streams is related to the hosting of the underlying application. In order to be able to use the <a rel=\"noreferrer noopener\" href=\"https:\/\/www.w3.org\/TR\/encrypted-media\/\" target=\"_blank\">Encrypted Media Extensions (EME)<\/a> &#8211; the W3C API which is mandatory for DRM playback and communication with the content decryption module (CDM) &#8211; web browsers typically mandate the use of https. If the application is called with http, dash.js outputs a warning that DRM playback is not possible:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>No supported version of EME detected on this user agent! - Attempts to play encrypted content will fail!<\/code><\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p>Protect yourself against protection<\/p><\/blockquote>\n\n\n\n<p>DRM itself can be a complicated topic. One thing that is fairly easy to remember, is the fact that there are three major DRM systems available: Google Widevine, Microsoft Playready and Apple Fairplay. In Google Chrome and Mozilla Firefox, Widevine is required to enable DRM playback while Edge Legacy only supports Playready. Some devices like SmartTVs or FireTVs support both Widevine and Playready. Consequently, before trying to play DRM protected content on a specific platform the underlying capabilities should be evaluated. When working with dash.js an output as shown below is generated as soon as a suitable DRM system has been found and selected:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> DRM: KeySystem Access Granted (com.widevine.alpha)!<\/code><\/pre>\n\n\n\n<p>If a platform supports multiple DRM systems it can be useful to define a selection priority<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>{\n    \"com.widevine.alpha\": {\n        \"serverURL\": \"someurl\",\n        \"priority\": 1\n    },\n    \"com.microsoft.playready\": {\n        \"serverURL\": \"someurl\",\n        \"priority\": 2\n    }\n}<\/code><\/pre>\n\n\n\n<p>In this case, dash.js checks for the support of Widevine before Playready.<\/p>\n\n\n\n<p>You can learn more about DRM in our previous blog posts <a rel=\"noreferrer noopener\" href=\"https:\/\/websites.fraunhofer.de\/video-dev\/enabling-hardware-drm-on-android-chrome-using-the-encrypted-media-extensions\/\" target=\"_blank\">&#8220;Enabling Hardware DRM on Android Chrome using the Encrypted Media Extensions<\/a>&#8221; and <a href=\"https:\/\/websites.fraunhofer.de\/video-dev\/dash-js-license-acquisition-for-multiple-eme-versions\/\">&#8220;dash.js: License acquisition for multiple EME versions&#8221;<\/a>.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p>Model everything you can<\/p><\/blockquote>\n\n\n\n<p>In <a href=\"https:\/\/websites.fraunhofer.de\/video-dev\/dash-js-license-acquisition-for-multiple-eme-versions\/\">&#8220;dash.js: License acquisition for multiple EME versions&#8221;<\/a> we describe the concept of dash.js protection models. The key takeaway from this is, that dash.js implements three different versions of the EME, wrapped into protection models. Unfortunately, there are devices (greetings to everyone who has the &#8220;pleasure&#8221; to develop for Smart TVs and set-top boxes) which need customized versions of one of these protection models. When debugging DRM problems on such devices it is always worth checking if the EME calls need to be prefixed or changed.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Timing specific pitfalls<\/h2>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p>Don&#8217;t fall out of your window<\/p><\/blockquote>\n\n\n\n<p>A key concept when developing a DASH player or creating DASH MPDs is the understanding of the DASH timing model. The <a rel=\"noreferrer noopener\" href=\"https:\/\/dashif.org\/guidelines\/\" target=\"_blank\">DASH-IF IOP guidelines <\/a>and the <a rel=\"noreferrer noopener\" href=\"https:\/\/dashif-documents.azurewebsites.net\/Guidelines-TimingModel\/master\/Guidelines-TimingModel.html\" target=\"_blank\">DASH-IF implementation guidelines: restricted timing model<\/a> are very good resources to start with this. <br>A problem we encountered various times is caused by streams in which the presentation times of the available media segments are outside of the time shift buffer. The player can adapt his behavior in case explicit timing information with <em>&lt;SegmentTimeline&gt;<\/em> is given. The following figure illustrates this behavior:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/websites.fraunhofer.de\/video-dev\/wp-content\/uploads\/2020\/10\/timing_prob-3.png\" alt=\"\" class=\"wp-image-740\" width=\"683\" height=\"163\" srcset=\"https:\/\/websites.fraunhofer.de\/video-dev\/wp-content\/uploads\/2020\/10\/timing_prob-3.png 683w, https:\/\/websites.fraunhofer.de\/video-dev\/wp-content\/uploads\/2020\/10\/timing_prob-3-400x95.png 400w\" sizes=\"auto, (max-width: 683px) 100vw, 683px\" \/><\/figure>\n\n\n\n<p>The player uses the <em>MPD@timeShiftBufferDepth <\/em>attribute to determine the DVR window. In addition, a live delay is subtracted from the &#8220;UTC now&#8221; time in order to shorten the DVR window which results in an &#8220;effective DVR window&#8221;. During playback the underlying application is allowed to seek within the effective DVR window. <\/p>\n\n\n\n<p>In our example the presentation end time of the last available segment (segment 5) is outside of the DVR window. In this case the player has no segment to download and play. dash.js is able to handle such situations by adjusting the anchor time. The &#8220;UTC now&#8221; time is replaced by the &#8220;presentation end time&#8221; of the last segment. This results in adjusted values for the calculation of the &#8220;effective DVR window&#8221;. This feature is enabled by adjusting the settings parameters in the following way:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>player.updateSettings({\n   streaming: \n    {\n     calcSegmentAvailabilityRangeFromTimeline: true\n    }\n})<\/code><\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p>Use offsets to avoid upsets<\/p><\/blockquote>\n\n\n\n<p>The use of multiple periods in an MPD is a very common practice to enable ad-insertion in DASH streams. Let&#8217;s consider a very simple example in which we want to add a midroll to our main content:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/websites.fraunhofer.de\/video-dev\/wp-content\/uploads\/2020\/10\/midroll-1.png\" alt=\"\" class=\"wp-image-749\" width=\"559\" height=\"180\" srcset=\"https:\/\/websites.fraunhofer.de\/video-dev\/wp-content\/uploads\/2020\/10\/midroll-1.png 559w, https:\/\/websites.fraunhofer.de\/video-dev\/wp-content\/uploads\/2020\/10\/midroll-1-400x129.png 400w\" sizes=\"auto, (max-width: 559px) 100vw, 559px\" \/><\/figure>\n\n\n\n<p>In this case we play 8 seconds of main content before switching to the ad content. After the ad is finished we resume playback of the main content. The sum of all period durations leads to a media presentation duration of 18 seconds. <\/p>\n\n\n\n<p><br>In order to map segments to its target position in the media buffer, the MSE uses the internal presentation timestamps (earliest presentation time (EPT)) of the media segments and adds a configurable <a href=\"https:\/\/www.w3.org\/TR\/media-source\/#dom-sourcebuffer-timestampoffset\" target=\"_blank\" rel=\"noreferrer noopener\">timestampOffset<\/a>. Consequently,  the application can control the position of the segment in the buffer by adjusting the timestampOffset. <\/p>\n\n\n\n<p><br>Now, what does this mean for our example? Let&#8217;s assume the first segment of the main content and the first segment of the ad content have a EPT of 0. In DASH streaming, the presentation time of a segment is relative to the start of its period. So what happens if we simply set the MSE.timestampOffset for each segment to the start time of its period? This works fine for period 1 and period 2:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>--- Period 1 ---\nMSE.timestampOffset = Period@start = 0\nBufferPosition(Seg 1) = MSE.timestampOffset + EPT = 0 + 0 = 0 \nBufferPosition(Seg 4) = MSE.timestampOffset + EPT = 0 + 6 = 6\n\n--- Period 2 --- \nMSE.timestampOffset = Period@start = 8\nBufferPosition(Seg 1) = MSE.timestampOffset + EPT = 8 + 0 = 8 \nBufferPosition(Seg 2) = MSE.timestampOffset + EPT = 8 + 2 = 10<\/code><\/pre>\n\n\n\n<p>Now the problem occurs if we look into period 3. Since we start with segment 5 the EPT is not set to zero:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>--- Period 3 ---\nMSE.timestampOffset = Period@start = 12\nBufferPosition(Seg 5) = MSE.timestampOffset + EPT = 12 + 8 = 20 <\/code><\/pre>\n\n\n\n<p>Instead of positioning the first segment of period 3 at 12 seconds in the media presentation timeline, it ends up at 20 seconds. Luckily, there is an easy fix for this: On MPD level we can assign an individual <em>@presentationTimeOffset<\/em> for each period (Note: In this example we are simplifying things a bit. The <em>@presentationTimeOffset<\/em> can differ for each <em>Representation<\/em> in the MPD). dash.js uses the <em>@presentationTimeOffset<\/em> for the calculation of the MSE.timestampOffset. We set the value of the <em>@presentationTimeOffset<\/em> to the EPT of the first segment of the period:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>--- Period 3 ---\nMSE.timestampOffset = Period@start - @presentationTimeOffset = 12 - 8 = 4\nBufferPosition(Seg 5) = MSE.timestampOffset + EPT = 4 + 8 = 12 \nBufferPosition(Seg 6) = MSE.timestampOffset + EPT = 4 + 10 = 14 <\/code><\/pre>\n\n\n\n<p>Now all the segments are at the correct position in the media buffer and we end up with a continuous media presentation timeline. <\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p>Watch your buffer &#8211; gaps ahead<\/p><\/blockquote>\n\n\n\n<p>A huge problem for MSE based players are gaps in the timeline. Most MSE implementations can not handle situations in which the media buffer is not continuous and will stall as soon as the play position reaches a gap. Now what exactly do we mean when we talk about gaps and what causes gaps? From our experience, gaps are mainly caused by two reasons:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Subsequent periods do not align and consequently segments at period boundaries do not align.<\/li><li>The summed up media sample duration in a segment is shorter than indicated by its presentation duration.<\/li><\/ul>\n\n\n\n<p>Ultimately this leads to the following situation:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"578\" height=\"121\" src=\"https:\/\/websites.fraunhofer.de\/video-dev\/wp-content\/uploads\/2020\/10\/gap-1.png\" alt=\"\" class=\"wp-image-752\" srcset=\"https:\/\/websites.fraunhofer.de\/video-dev\/wp-content\/uploads\/2020\/10\/gap-1.png 578w, https:\/\/websites.fraunhofer.de\/video-dev\/wp-content\/uploads\/2020\/10\/gap-1-400x84.png 400w\" sizes=\"auto, (max-width: 578px) 100vw, 578px\" \/><\/figure>\n\n\n\n<p>In this case segment 1 and segment 2 are perfectly aligned, while there is a gap between segment 2 and segment 3. In order to avoid playback stalling in such situations dash.js has a sophisticated gap jumping mechanism in place. It can be enabled and configured with the following settings:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>player.updateSettings({\n   streaming: \n    {\n            jumpGaps: true,\n            jumpLargeGaps: true,\n            smallGapLimit: 1.5,\n    }\n})<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusion<\/h2>\n\n\n\n<p>In this blog post we shared six of the most common pitfalls in MPEG-DASH streaming. <\/p>\n\n\n\n<p>We highlighted the need for https when playing DRM protected streams and outlined the importance of using the correct platform for specific DRM systems. In addition, we motivated the need for implementing legacy versions of the EME. <\/p>\n\n\n\n<p>The timing model in MPEG-DASH is not always easy to understand. Wrong DVR windows lead to playback stalling and failing . In the context of multi-period ad-insertion it is important to align all periods using MPD specific attributes to avoid inconsistencies in the media buffer. Moreover, gaps in the media timeline should be avoided as MSE implementations can not handle gaps in the media buffer.<\/p>\n\n\n\n<p>Players like dash.js can handle most of these situations and can help identifying and solving such problems. <\/p>\n\n\n\n<p>If you have any additional question regarding our DASH activities or dash.js in particular, feel free to check out our <a onclick=\"wiredminds.trackEvent('TRACK-LINK: Link from:dash-pitfalls to:go-dash')\" href=\"https:\/\/www.fokus.fraunhofer.de\/go\/dash\">website.<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>As head developers of the dash.js project we are frequently facing situations in which we have to evaluate if the failure of a DASH stream is caused by an actual bug in the implementation of the dash.js player or by&#8230;<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3,5,4,2],"tags":[],"coauthors":[6,15],"class_list":["post-728","post","type-post","status-publish","format-standard","hentry","category-dash-js","category-encrypted-media-extensions","category-media-source-extensions","category-mpeg-dash"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Common pitfalls in MPEG-DASH streaming - Video-Dev<\/title>\n<meta name=\"description\" content=\"In this blog post we share some common mistakes in DASH streams.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/websites.fraunhofer.de\/video-dev\/common-pitfalls-in-mpeg-dash-streaming\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Common pitfalls in MPEG-DASH streaming - Video-Dev\" \/>\n<meta property=\"og:description\" content=\"In this blog post we share some common mistakes in DASH streams.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/websites.fraunhofer.de\/video-dev\/common-pitfalls-in-mpeg-dash-streaming\/\" \/>\n<meta property=\"og:site_name\" content=\"Video-Dev\" \/>\n<meta property=\"article:published_time\" content=\"2020-10-22T05:50:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2020-10-22T05:51:16+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/websites.fraunhofer.de\/video-dev\/wp-content\/uploads\/2020\/10\/timing_prob-3.png\" \/>\n<meta name=\"author\" content=\"Daniel Silhavy, Stefan Pham\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@dsilhavy\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Daniel Silhavy, Stefan Pham\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/websites.fraunhofer.de\\\/video-dev\\\/common-pitfalls-in-mpeg-dash-streaming\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/websites.fraunhofer.de\\\/video-dev\\\/common-pitfalls-in-mpeg-dash-streaming\\\/\"},\"author\":{\"name\":\"Daniel Silhavy\",\"@id\":\"https:\\\/\\\/websites.fraunhofer.de\\\/video-dev\\\/#\\\/schema\\\/person\\\/f7e1eee3cb4eae87a59648195014a809\"},\"headline\":\"Common pitfalls in MPEG-DASH streaming\",\"datePublished\":\"2020-10-22T05:50:00+00:00\",\"dateModified\":\"2020-10-22T05:51:16+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/websites.fraunhofer.de\\\/video-dev\\\/common-pitfalls-in-mpeg-dash-streaming\\\/\"},\"wordCount\":1314,\"commentCount\":6,\"image\":{\"@id\":\"https:\\\/\\\/websites.fraunhofer.de\\\/video-dev\\\/common-pitfalls-in-mpeg-dash-streaming\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/websites.fraunhofer.de\\\/video-dev\\\/wp-content\\\/uploads\\\/2020\\\/10\\\/timing_prob-3.png\",\"articleSection\":[\"dash.js\",\"Encrypted Media Extensions\",\"Media Source Extensions\",\"MPEG-DASH\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/websites.fraunhofer.de\\\/video-dev\\\/common-pitfalls-in-mpeg-dash-streaming\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/websites.fraunhofer.de\\\/video-dev\\\/common-pitfalls-in-mpeg-dash-streaming\\\/\",\"url\":\"https:\\\/\\\/websites.fraunhofer.de\\\/video-dev\\\/common-pitfalls-in-mpeg-dash-streaming\\\/\",\"name\":\"Common pitfalls in MPEG-DASH streaming - Video-Dev\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/websites.fraunhofer.de\\\/video-dev\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/websites.fraunhofer.de\\\/video-dev\\\/common-pitfalls-in-mpeg-dash-streaming\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/websites.fraunhofer.de\\\/video-dev\\\/common-pitfalls-in-mpeg-dash-streaming\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/websites.fraunhofer.de\\\/video-dev\\\/wp-content\\\/uploads\\\/2020\\\/10\\\/timing_prob-3.png\",\"datePublished\":\"2020-10-22T05:50:00+00:00\",\"dateModified\":\"2020-10-22T05:51:16+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/websites.fraunhofer.de\\\/video-dev\\\/#\\\/schema\\\/person\\\/f7e1eee3cb4eae87a59648195014a809\"},\"description\":\"In this blog post we share some common mistakes in DASH streams.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/websites.fraunhofer.de\\\/video-dev\\\/common-pitfalls-in-mpeg-dash-streaming\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/websites.fraunhofer.de\\\/video-dev\\\/common-pitfalls-in-mpeg-dash-streaming\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/websites.fraunhofer.de\\\/video-dev\\\/common-pitfalls-in-mpeg-dash-streaming\\\/#primaryimage\",\"url\":\"https:\\\/\\\/websites.fraunhofer.de\\\/video-dev\\\/wp-content\\\/uploads\\\/2020\\\/10\\\/timing_prob-3.png\",\"contentUrl\":\"https:\\\/\\\/websites.fraunhofer.de\\\/video-dev\\\/wp-content\\\/uploads\\\/2020\\\/10\\\/timing_prob-3.png\",\"width\":683,\"height\":163},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/websites.fraunhofer.de\\\/video-dev\\\/common-pitfalls-in-mpeg-dash-streaming\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/websites.fraunhofer.de\\\/video-dev\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Common pitfalls in MPEG-DASH streaming\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/websites.fraunhofer.de\\\/video-dev\\\/#website\",\"url\":\"https:\\\/\\\/websites.fraunhofer.de\\\/video-dev\\\/\",\"name\":\"Video-Dev\",\"description\":\"Future Applications and Media - Video Development Blog\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/websites.fraunhofer.de\\\/video-dev\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/websites.fraunhofer.de\\\/video-dev\\\/#\\\/schema\\\/person\\\/f7e1eee3cb4eae87a59648195014a809\",\"name\":\"Daniel Silhavy\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/websites.fraunhofer.de\\\/video-dev\\\/wp-content\\\/uploads\\\/2019\\\/11\\\/0-1-150x150.jpegccb13c1b60303228bf3c575f3345fe29\",\"url\":\"https:\\\/\\\/websites.fraunhofer.de\\\/video-dev\\\/wp-content\\\/uploads\\\/2019\\\/11\\\/0-1-150x150.jpeg\",\"contentUrl\":\"https:\\\/\\\/websites.fraunhofer.de\\\/video-dev\\\/wp-content\\\/uploads\\\/2019\\\/11\\\/0-1-150x150.jpeg\",\"caption\":\"Daniel Silhavy\"},\"description\":\"Daniel Silhavy studied Computer Science at the Technical University of Berlin (TUB). He received his Masters degree with the completion of his thesis \u201cAd Insertion in MPEG-DASH\u201d at Fraunhofer Institute for Open Communication Systems (FOKUS) in 2015. Currently, he is employed as a scientific assistant and project manager at the Business Unit Future Applications and Media (FAME). He specializes in the R&amp;D of topics dealing with IPTV and adaptive media streaming.\",\"sameAs\":[\"https:\\\/\\\/www.fokus.fraunhofer.de\\\/fame\\\/team\\\/silhavy\",\"https:\\\/\\\/www.linkedin.com\\\/in\\\/daniel-silhavy-21650a129\\\/\",\"https:\\\/\\\/x.com\\\/dsilhavy\"],\"url\":\"https:\\\/\\\/websites.fraunhofer.de\\\/video-dev\\\/author\\\/silhavy\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Common pitfalls in MPEG-DASH streaming - Video-Dev","description":"In this blog post we share some common mistakes in DASH streams.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/websites.fraunhofer.de\/video-dev\/common-pitfalls-in-mpeg-dash-streaming\/","og_locale":"en_US","og_type":"article","og_title":"Common pitfalls in MPEG-DASH streaming - Video-Dev","og_description":"In this blog post we share some common mistakes in DASH streams.","og_url":"https:\/\/websites.fraunhofer.de\/video-dev\/common-pitfalls-in-mpeg-dash-streaming\/","og_site_name":"Video-Dev","article_published_time":"2020-10-22T05:50:00+00:00","article_modified_time":"2020-10-22T05:51:16+00:00","og_image":[{"url":"https:\/\/websites.fraunhofer.de\/video-dev\/wp-content\/uploads\/2020\/10\/timing_prob-3.png","type":"","width":"","height":""}],"author":"Daniel Silhavy, Stefan Pham","twitter_card":"summary_large_image","twitter_creator":"@dsilhavy","twitter_misc":{"Written by":"Daniel Silhavy, Stefan Pham","Est. reading time":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/websites.fraunhofer.de\/video-dev\/common-pitfalls-in-mpeg-dash-streaming\/#article","isPartOf":{"@id":"https:\/\/websites.fraunhofer.de\/video-dev\/common-pitfalls-in-mpeg-dash-streaming\/"},"author":{"name":"Daniel Silhavy","@id":"https:\/\/websites.fraunhofer.de\/video-dev\/#\/schema\/person\/f7e1eee3cb4eae87a59648195014a809"},"headline":"Common pitfalls in MPEG-DASH streaming","datePublished":"2020-10-22T05:50:00+00:00","dateModified":"2020-10-22T05:51:16+00:00","mainEntityOfPage":{"@id":"https:\/\/websites.fraunhofer.de\/video-dev\/common-pitfalls-in-mpeg-dash-streaming\/"},"wordCount":1314,"commentCount":6,"image":{"@id":"https:\/\/websites.fraunhofer.de\/video-dev\/common-pitfalls-in-mpeg-dash-streaming\/#primaryimage"},"thumbnailUrl":"https:\/\/websites.fraunhofer.de\/video-dev\/wp-content\/uploads\/2020\/10\/timing_prob-3.png","articleSection":["dash.js","Encrypted Media Extensions","Media Source Extensions","MPEG-DASH"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/websites.fraunhofer.de\/video-dev\/common-pitfalls-in-mpeg-dash-streaming\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/websites.fraunhofer.de\/video-dev\/common-pitfalls-in-mpeg-dash-streaming\/","url":"https:\/\/websites.fraunhofer.de\/video-dev\/common-pitfalls-in-mpeg-dash-streaming\/","name":"Common pitfalls in MPEG-DASH streaming - Video-Dev","isPartOf":{"@id":"https:\/\/websites.fraunhofer.de\/video-dev\/#website"},"primaryImageOfPage":{"@id":"https:\/\/websites.fraunhofer.de\/video-dev\/common-pitfalls-in-mpeg-dash-streaming\/#primaryimage"},"image":{"@id":"https:\/\/websites.fraunhofer.de\/video-dev\/common-pitfalls-in-mpeg-dash-streaming\/#primaryimage"},"thumbnailUrl":"https:\/\/websites.fraunhofer.de\/video-dev\/wp-content\/uploads\/2020\/10\/timing_prob-3.png","datePublished":"2020-10-22T05:50:00+00:00","dateModified":"2020-10-22T05:51:16+00:00","author":{"@id":"https:\/\/websites.fraunhofer.de\/video-dev\/#\/schema\/person\/f7e1eee3cb4eae87a59648195014a809"},"description":"In this blog post we share some common mistakes in DASH streams.","breadcrumb":{"@id":"https:\/\/websites.fraunhofer.de\/video-dev\/common-pitfalls-in-mpeg-dash-streaming\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/websites.fraunhofer.de\/video-dev\/common-pitfalls-in-mpeg-dash-streaming\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/websites.fraunhofer.de\/video-dev\/common-pitfalls-in-mpeg-dash-streaming\/#primaryimage","url":"https:\/\/websites.fraunhofer.de\/video-dev\/wp-content\/uploads\/2020\/10\/timing_prob-3.png","contentUrl":"https:\/\/websites.fraunhofer.de\/video-dev\/wp-content\/uploads\/2020\/10\/timing_prob-3.png","width":683,"height":163},{"@type":"BreadcrumbList","@id":"https:\/\/websites.fraunhofer.de\/video-dev\/common-pitfalls-in-mpeg-dash-streaming\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/websites.fraunhofer.de\/video-dev\/"},{"@type":"ListItem","position":2,"name":"Common pitfalls in MPEG-DASH streaming"}]},{"@type":"WebSite","@id":"https:\/\/websites.fraunhofer.de\/video-dev\/#website","url":"https:\/\/websites.fraunhofer.de\/video-dev\/","name":"Video-Dev","description":"Future Applications and Media - Video Development Blog","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/websites.fraunhofer.de\/video-dev\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/websites.fraunhofer.de\/video-dev\/#\/schema\/person\/f7e1eee3cb4eae87a59648195014a809","name":"Daniel Silhavy","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/websites.fraunhofer.de\/video-dev\/wp-content\/uploads\/2019\/11\/0-1-150x150.jpegccb13c1b60303228bf3c575f3345fe29","url":"https:\/\/websites.fraunhofer.de\/video-dev\/wp-content\/uploads\/2019\/11\/0-1-150x150.jpeg","contentUrl":"https:\/\/websites.fraunhofer.de\/video-dev\/wp-content\/uploads\/2019\/11\/0-1-150x150.jpeg","caption":"Daniel Silhavy"},"description":"Daniel Silhavy studied Computer Science at the Technical University of Berlin (TUB). He received his Masters degree with the completion of his thesis \u201cAd Insertion in MPEG-DASH\u201d at Fraunhofer Institute for Open Communication Systems (FOKUS) in 2015. Currently, he is employed as a scientific assistant and project manager at the Business Unit Future Applications and Media (FAME). He specializes in the R&amp;D of topics dealing with IPTV and adaptive media streaming.","sameAs":["https:\/\/www.fokus.fraunhofer.de\/fame\/team\/silhavy","https:\/\/www.linkedin.com\/in\/daniel-silhavy-21650a129\/","https:\/\/x.com\/dsilhavy"],"url":"https:\/\/websites.fraunhofer.de\/video-dev\/author\/silhavy\/"}]}},"_links":{"self":[{"href":"https:\/\/websites.fraunhofer.de\/video-dev\/wp-json\/wp\/v2\/posts\/728","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/websites.fraunhofer.de\/video-dev\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/websites.fraunhofer.de\/video-dev\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/websites.fraunhofer.de\/video-dev\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/websites.fraunhofer.de\/video-dev\/wp-json\/wp\/v2\/comments?post=728"}],"version-history":[{"count":32,"href":"https:\/\/websites.fraunhofer.de\/video-dev\/wp-json\/wp\/v2\/posts\/728\/revisions"}],"predecessor-version":[{"id":775,"href":"https:\/\/websites.fraunhofer.de\/video-dev\/wp-json\/wp\/v2\/posts\/728\/revisions\/775"}],"wp:attachment":[{"href":"https:\/\/websites.fraunhofer.de\/video-dev\/wp-json\/wp\/v2\/media?parent=728"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/websites.fraunhofer.de\/video-dev\/wp-json\/wp\/v2\/categories?post=728"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/websites.fraunhofer.de\/video-dev\/wp-json\/wp\/v2\/tags?post=728"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/websites.fraunhofer.de\/video-dev\/wp-json\/wp\/v2\/coauthors?post=728"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}