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
Launch in Chrome. Paste URL, click on load. Wait 10secs.
The stream is two periods of 10seconds each. Playback stops after 10secs.
Older versions of dash.js play full length
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
The inband event demo seems to fail in the same way: http://dashif.org/reference/players/javascript/v2.4.1/samples/ad-insertion/inband.html.
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:
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:
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
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:
If you set the PTO to the BMDT of the first segment of the period the MPD should be valid. Do you guys agree?