Dash.js: MultiPeriod DASH stops at period boundary

Created on 5 Apr 2017  路  22Comments  路  Source: Dash-Industry-Forum/dash.js

For testing on TVs I used mp4box to generate single period DASH MPDs. I manually constructed a multi period DASH. Before going to test on TVs I tried it on dashjs ...

BTW, tested TVs (except one) play the stream without problems at period boundary and with seamless period transition. The TV that failed the test also stopped at the period boundary

Environment

Steps to reproduce

Launch in Chrome. Paste URL, click on load. Wait 10secs.

Observed behaviour

The stream is two periods of 10seconds each. Playback stops after 10secs.
Older versions of dash.js play full length

Multiperiod

Most helpful comment

Hi guys,
this is an interesting discussion as we have been testing with multiperiod lately. I agree with Dave, from my understanding the behavior is the following:

So for period 2 this currently means:

  • Position of the first segment in the buffer = 60sec (BMDT) + 60sec (SBTO)

If you set the PTO to the BMDT of the first segment of the period the MPD should be valid. Do you guys agree?

All 22 comments

The period duration is signalled as 10s, and the audio segment duration is signalled as 2s, but the actual buffered range after loading all the segment in the first period is 0.042666 - 9.919999 so playback stalls at this time.

If you nudge the currentTime up to 10s, the second period plays.

My understanding is that the signalled segment duration does not need to match exactly all segment durations.

Does your analysis say there is anything wrong with the MPD or the media segments?

My understanding is that the signalled segment duration does not need to match exactly all segment durations.

That's certainly true for at least the last segment. It looks all your segments are short of the signalled time.

I don't really understand how any MSE-based player is supposed to work if the period duration is signaled as some value which can never be reached by the amount of media presented to the player - I note Shaka won't play this stream either.

Since this is on-demand, you know the true segment duration and hence the true period duration and could set them accurately?

Does your analysis say there is anything wrong with the MPD or the media segments?

My analysis was just looking at the logs coming from dash.js :smile:

I'm seeing a similar issue with one of the dash.js reference page sources (https://media.axprod.net/TestVectors/v7-Clear/Manifest_MultiPeriod_1080p.mpd). Freezes at 12:14. This source does play through in Shaka.

Just thinking out load. Must not be getting the end of stream signal and the threshold is not close enough to trigger switchStream()

Thanks all for your feedback.

Based on Dave's and Dan's comments I modified the signalled duration of the overall presentation and for each period to 19 s and 9.5 s resp. Now it plays through.

http://akamai-progressive.irt.de/Interop/201703/multiperiod1/period1-2_v4.mpd

BTW, 9.92s was not sufficient

I am not familiar with dash.js itself, but is that threshold you are talking about configurable? thank you

I am having a similiar problem.
I have a multi-period content (this is a DASH-IF vector) : http://dash.edgesuite.net/dash264/TestCasesIOP33/misc/manifest_1second.mpd

It has three periods:

  • Period 1 -> 60 seconds
  • Period 2 -> 60 seconds
  • Period 3 -> 10 minute and 14.167 seconds

The v2.4.1 plays until the end of the first period and then just stops.
I am unable to figure out what is the problem.

@bbcrddave and @AkamaiDASH - Any suggestions to solve this would be helpful?

Note that, the same content without multi-period :
http://dash.edgesuite.net/dash264/TestCasesIOP33/misc/manifest_test.mpd
plays perfectly in the player.

Typically MP breaks because the end of stream is not triggered which kicks off the switchStream call. You need to debug your stream in the stream.js and streamController.js. See if the period end is be detected and the call to switchStream is being hit.

@AkamaiDASH Thanks for the reply.
I tried that. I see that period end is detected and the call to switchStream is being hit.
But still the player does not play this multi period content.

Strangely, in the logs I observed that at 59.9th second, the player seeks to 120 second.
Shouldn't it be seeking to 60th second instead?

This you will find as 'Debug.js:108 [16823] Seeking to: 120' in the partial log file attached below.
Any ideas?

[9427] SegmentTemplate: 57 / 60 
Debug.js:108 [9427] Getting the next request at index: 58 
Debug.js:108 [9427] SegmentTemplate: 58 / 60 
Debug.js:108 [9769] Buffered Range for type: video : 0  -  58.999999 
Debug.js:108 [9772] ThroughputRule requesting switch to index:  0 type:  video Average throughput 443724 kbps 
Debug.js:108 [9772] AbrController (video) stay on 0/0 (buffer: 5.713) 
Debug.js:108 [9772] Getting the request for video time : 59 
Debug.js:108 [9773] Index for video time 59 is 58 
Debug.js:108 [9773] SegmentTemplate: 58 / 60 
Debug.js:108 [9773] Getting the next request at index: 59 
Debug.js:108 [9773] SegmentTemplate: 59 / 60 
Debug.js:108 [10187] Buffered Range for type: video : 0  -  59.999999 
Debug.js:108 [10190] ThroughputRule requesting switch to index:  0 type:  video Average throughput 955744 kbps 
Debug.js:108 [10190] AbrController (video) stay on 0/0 (buffer: 6.296) 
Debug.js:108 [10190] Getting the request for video time : 60 
Debug.js:108 [10190] Index for video time 60 is 59 
Debug.js:108 [10191] SegmentTemplate: 59 / 60 
Debug.js:108 [10191] Getting the next request at index: 60 
Debug.js:108 [10191] Signal complete. 
Debug.js:108 [10192] Schedule controller stopping for video 
Debug.js:108 [10192] Stream is complete 
Debug.js:108 [16402] MediaSource attached to element.  Waiting on open... 
Debug.js:108 [16420] MediaSource is open! 
Debug.js:108 [16421] Duration successfully set to: 734.167 
Debug.js:108 [16421] Added 0 inline events 
Debug.js:108 [16421] video codec: video/mp4;codecs="avc1.640028" 
Debug.js:108 [16423] Schedule controller stopping for video 
Debug.js:108 [16424] No audio data. 
Debug.js:108 [16424] No text data. 
Debug.js:108 [16424] No fragmentedText data. 
Debug.js:108 [16425] No embeddedText data. 
Debug.js:108 [16425] No muxed data. 
Debug.js:108 [16426] Schedule controller starting for video 
Debug.js:108 [16427] Requesting seek to time: 60 
Debug.js:108 [16427] Start Event Controller 
Debug.js:108 [16428] Native video element event: play 
Debug.js:108 [16430] Init fragment finished loading saving to video's init cache 
Debug.js:108 [16431] Native video element event: loadedmetadata 
Debug.js:108 [16432] Seeking to: 60 
Debug.js:108 [16460] Top qualityvideo index has changed from undefined to 0 
Debug.js:108 [16460] AbrController (video) stay on 0/0 (buffer: 0) 
Debug.js:108 [16461] Getting the request for video time : 60 
Debug.js:108 [16461] SegmentTemplate: 0 / 60 
Debug.js:108 [16823] Buffered Range for type: video : 120  -  120.999999 
Debug.js:108 [16823] Requesting seek to time: 120 
Debug.js:108 [16823] Seeking to: 120 
Debug.js:108 [16824] Schedule controller stopping for video 
Debug.js:108 [16825] MediaSource attached to element.  Waiting on open... 
Debug.js:108 [16825] Caught pending play exception - continuing (AbortError: The play() request was interrupted by a new load request.) 
dash.all.debug.js:3069 [16838] MediaSource is open! 
dash.all.debug.js:3069 [16838] Duration successfully set to: 734.167 
dash.all.debug.js:3069 [16838] Added 0 inline events 
dash.all.debug.js:3069 [16839] video codec: video/mp4;codecs="avc1.640028" 
dash.all.debug.js:3069 [16840] Schedule controller stopping for video 
dash.all.debug.js:3069 [16840] No audio data. 
dash.all.debug.js:3069 [16841] No text data. 
dash.all.debug.js:3069 [16841] No fragmentedText data. 
dash.all.debug.js:3069 [16841] No embeddedText data. 
Debug.js:108 [16841] No muxed data. 
Debug.js:108 [16842] Schedule controller starting for video 
Debug.js:108 [16843] Requesting seek to time: 120 
Debug.js:108 [16843] Start Event Controller 
Debug.js:108 [16843] Native video element event: play 
Debug.js:108 [16844] Init fragment finished loading saving to video's init cache 
Debug.js:108 [16846] Native video element event: loadedmetadata 
Debug.js:108 [16846] Seeking to: 120 
Debug.js:108 [16847] Top qualityvideo index has changed from undefined to 0 
Debug.js:108 [16848] AbrController (video) stay on 0/0 (buffer: 0) 
Debug.js:108 [16848] Getting the request for video time : 120 
Debug.js:108 [16848] SegmentTemplate: 0 / 614.167 
Debug.js:108 [16864] Buffered Range for type: video : 240  -  240.999999 

@AdithyanIlangovan can you test to see if your stream worked in any other versions back to 2.0
http://dashif.org/reference/players/javascript/

@AkamaiDASH I tried that. The same problem exists in all the version starting from 2.0 until now.

Good to know, may mean no regression from the few static multiperiod streams we have and use to test, but a new scenario is exhibited in your presentation which fails. My advice would be to start debugging exactly where it is failing. If you say you get the End of stream event and swtichStream is called, where does it go from there. You should get a new source buffer created and a seek to the start point etc. How far does the code execute?

@AkamaiDASH Okay.

I observe a strange behaviour at the period boundary.
At end of the first period (60s), the player seeks to 120s and then immediately after that seeks to 240s.
The log file is attached below :

Index for video time 60 is 59 
Debug.js:108 [10621] SegmentTemplate: 59 / 60 
Debug.js:108 [10622] Getting the next request at index: 60 
Debug.js:108 [10622] Signal complete. 
Debug.js:108 [10623] Schedule controller stopping for video 
Debug.js:108 [10623] Stream is complete 
Debug.js:108 [21039] MediaSource attached to element.  Waiting on open... 
Debug.js:108 [21059] MediaSource is open! 
Debug.js:108 [21059] Duration successfully set to: 734.167 
Debug.js:108 [21060] Added 0 inline events 
Debug.js:108 [21060] video codec: video/mp4;codecs="avc1.640028" 
Debug.js:108 [21063] No audio data. 
Debug.js:108 [21063] No text data. 
Debug.js:108 [21064] No fragmentedText data. 
Debug.js:108 [21064] No embeddedText data. 
Debug.js:108 [21064] No muxed data. 
Debug.js:108 [21064] Schedule controller starting for video 
Debug.js:108 [21065] Requesting seek to time: 60 
Debug.js:108 [21065] Start Event Controller 
Debug.js:108 [21066] Native video element event: play 
Debug.js:108 [21069] Top qualityvideo index has changed from undefined to 0 
Debug.js:108 [21069] ThroughputRule requesting switch to index:  0 type:  video Average throughput 477872 kbps 
Debug.js:108 [21069] AbrController (video) stay on 0/0 (buffer: 0.976) 
Debug.js:108 [21108] Init fragment finished loading saving to video's init cache 
Debug.js:108 [21110] Native video element event: loadedmetadata 
Debug.js:108 [21110] Seeking to: 60 
Debug.js:108 [21122] AbrController (video) stay on 0/0 (buffer: 0) 
Debug.js:108 [21122] Getting the request for video time : 60 
Debug.js:108 [21122] SegmentTemplate: 0 / 60 
Debug.js:108 [21183] Buffered Range for type: video : 120  -  120.999999 
Debug.js:108 [21184] Requesting seek to time: 120 
Debug.js:108 [21184] Seeking to: 120 
Debug.js:108 [21184] Schedule controller stopping for video 
Debug.js:108 [21185] MediaSource attached to element.  Waiting on open... 
Debug.js:108 [21186] Schedule controller starting for video 
ScheduleController.js:435 Uncaught TypeError: Cannot read property 'getTime' of null
    at Object.onPlaybackSeeking (http://10.4.247.98/dash.js/dist/dash.all.debug.js:18908:121)
    at http://10.4.247.98/dash.js/dist/dash.all.debug.js:3694:37
    at Array.forEach (native)
    at Object.trigger (http://10.4.247.98/dash.js/dist/dash.all.debug.js:3693:24)
    at HTMLVideoElement.onPlaybackSeeking (http://10.4.247.98/dash.js/dist/dash.all.debug.js:18293:18)
onPlaybackSeeking @ ScheduleController.js:435
(anonymous) @ EventBus.js:88
trigger @ EventBus.js:88
onPlaybackSeeking @ PlaybackController.js:388
Debug.js:108 [21188] Caught pending play exception - continuing (AbortError: The play() request was interrupted by a new load request.) 
ScheduleController.js:192 Uncaught TypeError: Cannot read property 'isPaused' of null
    at schedule (ScheduleController.js:192)
schedule @ ScheduleController.js:192
Debug.js:108 [21200] MediaSource is open! 
Debug.js:108 [21200] Duration successfully set to: 734.167 
Debug.js:108 [21200] Added 0 inline events 
Debug.js:108 [21201] video codec: video/mp4;codecs="avc1.640028" 
Debug.js:108 [21202] No audio data. 
Debug.js:108 [21203] No text data. 
Debug.js:108 [21203] No fragmentedText data. 
Debug.js:108 [21203] No embeddedText data. 
Debug.js:108 [21203] No muxed data. 
Debug.js:108 [21204] Schedule controller starting for video 
Debug.js:108 [21204] Requesting seek to time: 120 
Debug.js:108 [21205] Start Event Controller 
Debug.js:108 [21205] Native video element event: play 
Debug.js:108 [21206] Top qualityvideo index has changed from undefined to 0 
Debug.js:108 [21206] AbrController (video) stay on 0/0 (buffer: 0) 
Debug.js:108 [21244] Init fragment finished loading saving to video's init cache 
Debug.js:108 [21245] Native video element event: loadedmetadata 
Debug.js:108 [21245] Seeking to: 120 
Debug.js:108 [21247] AbrController (video) stay on 0/0 (buffer: 0) 
Debug.js:108 [21247] Getting the request for video time : 120 
Debug.js:108 [21247] SegmentTemplate: 0 / 614.167 
Debug.js:108 [21327] Buffered Range for type: video : 240  -  240.999999 
Debug.js:108 [21328] Requesting seek to time: 240 
Debug.js:108 [21329] Seeking to: 240 
Debug.js:108 [21329] Got enough buffer to start. 
Debug.js:108 [21330] ThroughputRule requesting switch to index:  0 type:  video Average throughput 474636 kbps 
Debug.js:108 [21331] AbrController (video) stay on 0/0 (buffer: 1) 
Debug.js:108 [21331] Prior to making a request for time, NextFragmentRequestRule is aligning index handler's currentTime with bufferedRange.end. 240  was changed to  240.999999 
Debug.js:108 [21331] Getting the request for video time : 240.999999 
Debug.js:108 [21331] Index for video time 240.999999 is 120 
Debug.js:108 [21332] SegmentTemplate: 120 / 614.167 
Debug.js:108 [21351] Native video element event: seeked 
Debug.js:108 [21351] Native video element event: playing 
Debug.js:108 [21402] Buffered Range for type: video : 240  -  240.999999 
Debug.js:108 [21402] Buffered Range for type: video : 360  -  360.999999 
Debug.js:108 [21404] ThroughputRule requesting switch to index:  0 type:  video Average throughput 690592 kbps 
Debug.js:108 [21405] AbrController (video) stay on 0/0 (buffer: 0.947) 
Debug.js:108 [21405] Getting the request for video time : 241 
Debug.js:108 [21406] Index for video time 241 is 120 
Debug.js:108 [21406] SegmentTemplate: 120 / 614.167 
Debug.js:108 [21407] Getting the next request at index: 121 
Debug.js:108 [21407] SegmentTemplate: 121 / 614.167 
Debug.js:108 [21478] Buffered Range for type: video : 240  -  240.999999 
Debug.js:108 [21478] Buffered Range for type: video : 360  -  361.999999 
Debug.js:108 [21480] ThroughputRule requesting switch to index:  0 type:  video Average throughput 367932 kbps 
Debug.js:108 [21481] AbrController (video) stay on 0/0 (buffer: 0.871) 
Debug.js:108 [21481] Getting the request for video time : 242 
Debug.js:108 [21481] Index for video time 242 is 121 
Debug.js:108 [21481] SegmentTemplate: 121 / 614.167 
Debug.js:108 [21482] Getting the next request at index: 122 
Debug.js:108 [21482] SegmentTemplate: 122 / 614.167 

After the first period, I think a new source buffer is created. But there is some problems seeking to the start point. I do not know why.
I tried debugging the problem, but I am bit lost (new to dash.js).

Any ideas?

I don't think the test case is valid - I note Shaka also fails to play. I believe a presentationTimeOffset of (60s * period index) is required in each Period of this particular asset.

The reason the player seeks to 120 is because it is applying an offset of PeriodStart to the timeline at the beginning of each Period. When the first media segment of the second Period is added (media time: 60s), the position on the timeline of that media is 120, so that is where the player attempts to seek.

The Uncaught TypeError is a bit concerning ...

Uncaught TypeError on period switch seems to have been caused by https://github.com/Dash-Industry-Forum/dash.js/pull/1774. I'll open a seperate issue.

Hi guys,
this is an interesting discussion as we have been testing with multiperiod lately. I agree with Dave, from my understanding the behavior is the following:

So for period 2 this currently means:

  • Position of the first segment in the buffer = 60sec (BMDT) + 60sec (SBTO)

If you set the PTO to the BMDT of the first segment of the period the MPD should be valid. Do you guys agree?

@bbcrddave and @dsilhavy Thank you for the clarification.
I did as suggested. And it works now, the player plays it correctly.

Just for the sake of future reference for others, I am adding the change I did here.
I changed the old mpd without presentationTimeOffset

 <Period id="0" duration="PT60S">
  <AdaptationSet segmentAlignment="true" maxWidth="1920" maxHeight="1080" maxFrameRate="24" par="16:9" lang="eng">
   <Representation id="1" mimeType="video/mp4" codecs="avc1.640028" width="1920" height="1080" frameRate="24" sar="1:1" startWithSAP="1" bandwidth="1013045">
    <SegmentTemplate timescale="12288" media="tears_of_steel_1080p_1000k_h264_24_dash_track1_$Number$.m4s" startNumber="1" duration="12288" initialization="tears_of_steel_1080p_1000k_h264_24_dash_track1_init.mp4"/>
   </Representation>
  </AdaptationSet>
 </Period>

 <Period id="1" duration="PT60S">
  <AdaptationSet segmentAlignment="true" maxWidth="1920" maxHeight="1080" maxFrameRate="24" par="16:9" lang="eng">
   <Representation id="1" mimeType="video/mp4" codecs="avc1.640028" width="1920" height="1080" frameRate="24" sar="1:1" startWithSAP="1" bandwidth="1013045">
    <SegmentTemplate timescale="12288" media="tears_of_steel_1080p_1000k_h264_24_dash_track1_$Number$.m4s" startNumber="61" duration="12288" initialization="tears_of_steel_1080p_1000k_h264_24_dash_track1_init.mp4"/>
   </Representation>
  </AdaptationSet>
 </Period>

 <Period id="2" duration="PT0H10M14.167S">
  <AdaptationSet segmentAlignment="true" maxWidth="1920" maxHeight="1080" maxFrameRate="24" par="16:9" lang="eng">
   <Representation id="1" mimeType="video/mp4" codecs="avc1.640028" width="1920" height="1080" frameRate="24" sar="1:1" startWithSAP="1" bandwidth="1013045">
    <SegmentTemplate timescale="12288" media="tears_of_steel_1080p_1000k_h264_24_dash_track1_$Number$.m4s" startNumber="121" duration="12288" initialization="tears_of_steel_1080p_1000k_h264_24_dash_track1_init.mp4"/>
   </Representation>
  </AdaptationSet>
 </Period> 

to the one with presentationTimeOffset

 <Period id="0" duration="PT60S">
  <AdaptationSet segmentAlignment="true" maxWidth="1920" maxHeight="1080" maxFrameRate="24" par="16:9" lang="eng">
   <Representation id="1" mimeType="video/mp4" codecs="avc1.640028" width="1920" height="1080" frameRate="24" sar="1:1" startWithSAP="1" bandwidth="1013045">
    <SegmentTemplate timescale="12288" media="tears_of_steel_1080p_1000k_h264_24_dash_track1_$Number$.m4s" startNumber="1" duration="12288" initialization="tears_of_steel_1080p_1000k_h264_24_dash_track1_init.mp4" presentationTimeOffset="0"/>
   </Representation>
  </AdaptationSet>
 </Period>

 <Period id="1" duration="PT60S">
  <AdaptationSet segmentAlignment="true" maxWidth="1920" maxHeight="1080" maxFrameRate="24" par="16:9" lang="eng">
   <Representation id="1" mimeType="video/mp4" codecs="avc1.640028" width="1920" height="1080" frameRate="24" sar="1:1" startWithSAP="1" bandwidth="1013045">
    <SegmentTemplate timescale="12288" media="tears_of_steel_1080p_1000k_h264_24_dash_track1_$Number$.m4s" startNumber="61" duration="12288" initialization="tears_of_steel_1080p_1000k_h264_24_dash_track1_init.mp4" presentationTimeOffset="737280"/>
   </Representation>
  </AdaptationSet>
 </Period>

 <Period id="2" duration="PT0H10M14.167S">
  <AdaptationSet segmentAlignment="true" maxWidth="1920" maxHeight="1080" maxFrameRate="24" par="16:9" lang="eng">
   <Representation id="1" mimeType="video/mp4" codecs="avc1.640028" width="1920" height="1080" frameRate="24" sar="1:1" startWithSAP="1" bandwidth="1013045">
    <SegmentTemplate timescale="12288" media="tears_of_steel_1080p_1000k_h264_24_dash_track1_$Number$.m4s" startNumber="121" duration="12288" initialization="tears_of_steel_1080p_1000k_h264_24_dash_track1_init.mp4" presentationTimeOffset="1474560"/>
   </Representation>
  </AdaptationSet>
 </Period> 

I think, the problem mainly arised because I took long single period content and then just split into multiple period. This is I did without considering the effect on media time.

Ideally, at the beginning of every period, if no presentationTimeOffset is given in the .mpd, the segments should start with BaseMediaDecodeTime of zero.

If they do not start with zero, then presentationTimeOffset should be given to compensate this.

Thanks once again!

Hello,
Is this thread still open?
I'm testing on version 2.5.0 and the multiperiod MPDs are stopped at period boundary. You can see it with any example MPD in the demo page.

There are times that if it goes to the next period but it is not seamless, it takes quite a few seconds. In this case, if we go back and reproduce again, it will stop. This worked in earlier versions, such as 2.1.0

Tested on Chrome, Firefox and Edge.

Thank you and congratulations on your great work!

I am also having this problem. I've created a manifest using 2 Periods.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <MPD type="static" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:mpeg:dash:schema:mpd:2011 DASH-MPD.xsd" profiles="urn:mpeg:dash:profile:isoff-live:2011" xmlns="urn:mpeg:dash:schema:mpd:2011" minBufferTime="PT1.500S" mediaPresentationDuration="PT90S"> <Period id="0" duration="PT60S" start="PT0S"> <AdaptationSet contentType="audio" lang="en" mimeType="audio/mp4" segmentAlignment="true" startWithSAP="1"> <SegmentTemplate initialization="https://znipe-video.storage.googleapis.com/streams/TEST/NOV02/P1/audio/$RepresentationID$/init.mp4" media="https://znipe-video.storage.googleapis.com/streams/TEST/NOV02/P1/audio/$RepresentationID$/segment_$Number$.m4s" startNumber="2436" presentationTimeOffset="9744" timescale="1"> <SegmentTimeline> <S t="9744" d="4" r="14"/> </SegmentTimeline> </SegmentTemplate> <Representation bandwidth="128000" codecs="mp4a.40.2" audioSamplingRate="48000" id="128kbps"/> </AdaptationSet> <AdaptationSet contentType="video" maxHeight="1080" maxWidth="1920" mimeType="video/mp4" minHeight="240" minWidth="426" segmentAlignment="true" startWithSAP="1"> <SegmentTemplate initialization="https://znipe-video.storage.googleapis.com/streams/TEST/NOV02/P1/video/$RepresentationID$/init.mp4" media="https://znipe-video.storage.googleapis.com/streams/TEST/NOV02/P1/video/$RepresentationID$/segment_$Number$.m4s" startNumber="2436" presentationTimeOffset="9744" timescale="1"> <SegmentTimeline> <S t="9744" d="4" r="14"/> </SegmentTimeline> </SegmentTemplate> <Representation bandwidth="400000" codecs="avc1.42c00d" frameRate="60000/1000" height="240" width="426" id="240p"/> <Representation bandwidth="800000" codecs="avc1.42c00d" frameRate="60000/1000" height="360" width="640" id="360p"/> <Representation bandwidth="1200000" codecs="avc1.42c00d" frameRate="60000/1000" height="480" width="858" id="460p"/> <Representation bandwidth="2400000" codecs="avc1.42c00d" frameRate="60000/1000" height="720" width="1280" id="720p"/> <Representation bandwidth="4800000" codecs="avc1.42c00d" frameRate="60000/1000" height="1080" width="1920" id="1080p"/> </AdaptationSet> </Period> <Period id="1" duration="PT30S"> <AdaptationSet contentType="audio" lang="en" mimeType="audio/mp4" segmentAlignment="true" startWithSAP="1"> <SegmentTemplate initialization="https://znipe-video.storage.googleapis.com/streams/TEST/NOV02/P1/audio/$RepresentationID$/init.mp4" media="https://znipe-video.storage.googleapis.com/streams/TEST/NOV02/P1/audio/$RepresentationID$/segment_$Number$.m4s" startNumber="2428" presentationTimeOffset="9714" timescale="1"> <SegmentTimeline> <S t="9714" d="4" r="7"/> </SegmentTimeline> </SegmentTemplate> <Representation bandwidth="128000" codecs="mp4a.40.2" audioSamplingRate="48000" id="128kbps"/> </AdaptationSet> <AdaptationSet contentType="video" maxHeight="1080" maxWidth="1920" mimeType="video/mp4" minHeight="240" minWidth="426" segmentAlignment="true" startWithSAP="1"> <SegmentTemplate initialization="https://znipe-video.storage.googleapis.com/streams/TEST/NOV02/P1/video/$RepresentationID$/init.mp4" media="https://znipe-video.storage.googleapis.com/streams/TEST/NOV02/P1/video/$RepresentationID$/segment_$Number$.m4s" startNumber="2428" presentationTimeOffset="9714" timescale="1"> <SegmentTimeline> <S t="9714" d="4" r="7"/> </SegmentTimeline> </SegmentTemplate> <Representation bandwidth="400000" codecs="avc1.42c00d" frameRate="60000/1000" height="240" width="426" id="240p"/> <Representation bandwidth="800000" codecs="avc1.42c00d" frameRate="60000/1000" height="360" width="640" id="360p"/> <Representation bandwidth="1200000" codecs="avc1.42c00d" frameRate="60000/1000" height="480" width="858" id="460p"/> <Representation bandwidth="2400000" codecs="avc1.42c00d" frameRate="60000/1000" height="720" width="1280" id="720p"/> <Representation bandwidth="4800000" codecs="avc1.42c00d" frameRate="60000/1000" height="1080" width="1920" id="1080p"/> </AdaptationSet> </Period> </MPD>

I've tested the manifest in version 2.0.0 and newer at http://dashif.org/reference/players/javascript/.
All versions up until 2.4.0 plays through both periods as expected, but it is not seamless as it you can see the player blinking black in-between the periods.
Version 2.4.0 and later stops playing after the first period.

Tested in chrome Version 59.0.3071.115 on macOS Sierra 10.12.5

Hello,
I am expecting the same issue with static Muliperiod manifests.
I mainly test on Chrome 59, but few tests on other browsers give the same result.

Sometimes the player go through the period boundary and play the second period but it remain very unusual.
After digging a bit I found out the StreamController does not trigger the onEnded event at 1st period end. It may be due to the timeToEnd calculated by the PlaybackController at onPlaybackTimeUpdated() is way bigger than any acceptable threshold. The earliestTimecalculated for the 1st period could be the reason as it is set to the buffer range start in onBytesAppended().

Thanks for still working on VOD multiperiod.

WIth the current version of the dash.js player we jump over small gaps. Please reopen if any of the test streams referenced in this thread to not work as expected

Was this page helpful?
0 / 5 - 0 ratings

Related issues

lioun1729 picture lioun1729  路  6Comments

NguyenTungs picture NguyenTungs  路  5Comments

ruslandinov picture ruslandinov  路  4Comments

carlanton picture carlanton  路  5Comments

redd29 picture redd29  路  4Comments