Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Level suppression #1535

Closed
1 task
ssreed opened this issue Jan 31, 2018 · 6 comments
Closed
1 task

Level suppression #1535

ssreed opened this issue Jan 31, 2018 · 6 comments
Labels

Comments

@ssreed
Copy link
Contributor

ssreed commented Jan 31, 2018

Currently, it seems hls.js does not have any form of "suppression" or "marking" of problematic levels. For example, if there are a number segments in a level that are 404ing, hls.js would step down to a lower level but then immediately retry the higher level which leads to unnecessary network requests. It initially seemed to me this line

this.timer = setTimeout(() => this.loadLevel(), delay);
introduced in #1452, would solve the issue but it looks like it's simply delaying any level request, not the problematic one.

Is there currently a way to achieve this?

Environment
Steps to reproduce
  1. Start playing the stream.
  2. 404 fragments on the highest level. ( I did this via Charles )
  3. Observe hls.js switch down to the lower level and frequently attempt to switch back to level since bandwidth is available.
Expected behavior

The player should avoid switching to the problematic level for a set amount of time. That time could be config driven.

Actual behavior

The player continues to try to switch to the level even though segments are being 404'd.

Network

hlsjs-404-segments

Console output
15:24:05.203 logger.js:37 [log] > loadSource:https://video-dev.github.io/streams/x36xhzz/x36xhzz.m3u8
15:24:05.205 logger.js:37 [log] > trigger BUFFER_RESET
15:24:05.206 logger.js:37 [log] > set autoLevelCapping:-1
15:24:05.206 logger.js:37 [log] > attachMedia
15:24:05.216 logger.js:37 [log] > media source opened
15:24:05.412 logger.js:37 [log] > manifest loaded,5 level(s) found, first bitrate:2149280
15:24:05.413 logger.js:37 [log] > both AAC/HE-AAC audio found in levels; declaring level codec as HE-AAC
15:24:05.414 VM528:1 XHR finished loading: GET "https://video-dev.github.io/streams/x36xhzz/x36xhzz.m3u8".
(anonymous) @ VM528:1
loadInternal @ xhr-loader.js:80
load @ xhr-loader.js:39
load @ playlist-loader.js:218
onManifestLoading @ playlist-loader.js:139
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
loadSource @ hls.js:173
loadSelectedStream @ main.js:197
(anonymous) @ main.js:69
dispatch @ jquery.min.js:3
r.handle @ jquery.min.js:3
15:24:05.414 logger.js:37 [log] > startLoad(-1)
15:24:05.415 logger.js:37 [log] > switching to level 3
15:24:05.419 logger.js:37 [log] > main stream:STOPPED->IDLE
15:24:05.421 logger.js:37 [log] > audio tracks updated
15:24:05.423 logger.js:37 [log] > subtitle tracks updated
15:24:05.527 logger.js:37 [log] > level 3 loaded [0,63],duration:634.584
15:24:05.528 VM528:1 XHR finished loading: GET "https://video-dev.github.io/streams/x36xhzz/url_0/193039199_mp4_h264_aac_hd_7.m3u8".
(anonymous) @ VM528:1
loadInternal @ xhr-loader.js:80
load @ xhr-loader.js:39
load @ playlist-loader.js:218
onLevelLoading @ playlist-loader.js:143
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:84
trigger @ hls.js:81
setLevelInternal @ level-controller.js:188
set @ level-controller.js:162
set @ level-controller.js:413
set @ hls.js:245
startLoad @ stream-controller.js:82
(anonymous) @ hls.js:178
startLoad @ hls.js:178
onManifestParsed @ stream-controller.js:881
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
onManifestLoaded @ level-controller.js:129
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
_handleMasterPlaylist @ playlist-loader.js:306
loadsuccess @ playlist-loader.js:248
readystatechange @ xhr-loader.js:117
XMLHttpRequest.send (async)
(anonymous) @ VM528:1
loadInternal @ xhr-loader.js:80
load @ xhr-loader.js:39
load @ playlist-loader.js:218
onManifestLoading @ playlist-loader.js:139
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
loadSource @ hls.js:173
loadSelectedStream @ main.js:197
(anonymous) @ main.js:69
dispatch @ jquery.min.js:3
r.handle @ jquery.min.js:3
15:24:05.529 logger.js:37 [log] > Loading 0 of [0 ,63],level 3, currentTime:0.000,bufferEnd:0.000
15:24:05.532 logger.js:37 [log] > demuxing in webworker
15:24:05.542 logger.js:37 [log] > main stream:IDLE->FRAG_LOADING
15:24:05.544 main.js:317 parsing level duration :1215us,count:1
15:24:06.326 VM528:1 XHR finished loading: GET "https://video-dev.github.io/streams/x36xhzz/url_0/url_462/193039199_mp4_h264_aac_hd_7.ts".
(anonymous) @ VM528:1
loadInternal @ xhr-loader.js:80
load @ xhr-loader.js:39
onFragLoading @ fragment-loader.js:76
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
_loadFragmentOrKey @ stream-controller.js:513
_fetchPayloadOrEos @ stream-controller.js:302
_doTickIdle @ stream-controller.js:254
doTick @ stream-controller.js:127
tick @ task-loop.js:58
onLevelLoaded @ stream-controller.js:951
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
_handlePlaylistLoaded @ playlist-loader.js:463
_handleTrackOrLevelPlaylist @ playlist-loader.js:379
loadsuccess @ playlist-loader.js:246
readystatechange @ xhr-loader.js:117
XMLHttpRequest.send (async)
(anonymous) @ VM528:1
loadInternal @ xhr-loader.js:80
load @ xhr-loader.js:39
load @ playlist-loader.js:218
onLevelLoading @ playlist-loader.js:143
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:84
trigger @ hls.js:81
setLevelInternal @ level-controller.js:188
set @ level-controller.js:162
set @ level-controller.js:413
set @ hls.js:245
startLoad @ stream-controller.js:82
(anonymous) @ hls.js:178
startLoad @ hls.js:178
onManifestParsed @ stream-controller.js:881
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
onManifestLoaded @ level-controller.js:129
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
_handleMasterPlaylist @ playlist-loader.js:306
loadsuccess @ playlist-loader.js:248
readystatechange @ xhr-loader.js:117
XMLHttpRequest.send (async)
(anonymous) @ VM528:1
loadInternal @ xhr-loader.js:80
load @ xhr-loader.js:39
load @ playlist-loader.js:218
onManifestLoading @ playlist-loader.js:139
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
loadSource @ hls.js:173
loadSelectedStream @ main.js:197
(anonymous) @ main.js:69
dispatch @ jquery.min.js:3
r.handle @ jquery.min.js:3
15:24:06.326 logger.js:37 [log] > Loaded  0 of [0 ,63],level 3
15:24:06.326 logger.js:37 [log] > main stream:FRAG_LOADING->PARSING
15:24:06.327 logger.js:37 [log] > Parsing 0 of [0 ,63],level 3, cc 0
15:24:06.328 logger.js:37 [log] > main:discontinuity detected
15:24:06.329 logger.js:37 [log] > main:switch detected
15:24:06.339 1d5f5471-f246-4ab0-9149-18e96cc8fa7a:516 [log] > manifest codec:mp4a.40.2,ADTS data:type:2,sampleingIndex:4[44100Hz],channelConfig:2
15:24:06.342 1d5f5471-f246-4ab0-9149-18e96cc8fa7a:516 [log] > parsed codec:mp4a.40.5,rate:44100,nb channel:2
15:24:06.366 1d5f5471-f246-4ab0-9149-18e96cc8fa7a:516 [log] > audio sampling rate : 44100
15:24:06.369 logger.js:37 [log] > InitPTS for cc: 0 found from video track: 900909
15:24:06.370 logger.js:37 [log] > creating sourceBuffer(audio/mp4;codecs=mp4a.40.5)
15:24:06.370 logger.js:37 [log] > creating sourceBuffer(video/mp4;codecs=avc1.64001f)
15:24:06.371 logger.js:37 [log] > main track:audio,container:audio/mp4,codecs[level/parsed]=[mp4a.40.5/mp4a.40.5]
15:24:06.371 logger.js:37 [log] > main track:video,container:video/mp4,codecs[level/parsed]=[avc1.64001f/avc1.64001f]
15:24:06.372 logger.js:37 [log] > Parsed audio,PTS:[0.010,10.018],DTS:[0.010/10.018],nb:431,dropped:0
15:24:06.377 logger.js:37 [log] > Parsed video,PTS:[0.033,10.033],DTS:[0.000/10.000],nb:600,dropped:0
15:24:06.377 logger.js:37 [log] > main stream:PARSING->PARSED
15:24:06.389 logger.js:37 [log] > main buffered : [0.010,10.000]
15:24:06.390 logger.js:37 [log] > latency/loading/parsing/append/kbps:110/683/54/12/17852
15:24:06.391 logger.js:37 [log] > main stream:PARSED->IDLE
15:24:06.392 logger.js:37 [log] > switching to level 4
15:24:06.394 logger.js:37 [log] > main stream:IDLE->WAITING_LEVEL
15:24:06.394 logger.js:37 [log] > target start position:0
15:24:06.395 logger.js:37 [log] > target start position not buffered, seek to buffered.start(0) 0.01009
15:24:06.395 logger.js:37 [log] > adjust currentTime from 0 to 0.01009
15:24:06.395 logger.js:37 [log] > Updating Media Source duration to 634.584
15:24:06.399 logger.js:37 [log] > media seeking to 0.010
15:24:06.404 logger.js:37 [log] > media seeked to 0.010
15:24:06.513 logger.js:37 [log] > level 4 loaded [0,63],duration:634.567
15:24:06.514 logger.js:37 [log] > main stream:WAITING_LEVEL->IDLE
15:24:06.515 VM528:1 XHR finished loading: GET "https://video-dev.github.io/streams/x36xhzz/url_8/193039199_mp4_h264_aac_fhd_7.m3u8".
(anonymous) @ VM528:1
loadInternal @ xhr-loader.js:80
load @ xhr-loader.js:39
load @ playlist-loader.js:218
onLevelLoading @ playlist-loader.js:143
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:84
trigger @ hls.js:81
setLevelInternal @ level-controller.js:188
set @ level-controller.js:162
set @ level-controller.js:413
set @ hls.js:245
_doTickIdle @ stream-controller.js:217
doTick @ stream-controller.js:127
tick @ task-loop.js:58
_checkAppendedParsed @ stream-controller.js:1289
onBufferAppended @ stream-controller.js:1263
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
onSBUpdateEnd @ buffer-controller.js:223
15:24:06.515 logger.js:37 [log] > Loading 1 of [0 ,63],level 4, currentTime:0.070,bufferEnd:10.000
15:24:06.516 logger.js:37 [log] > main stream:IDLE->FRAG_LOADING
15:24:06.518 main.js:317 parsing level duration :828us,count:2
15:24:06.709 VM528:1 GET https://video-dev.github.io/streams/x36xhzz/url_8/url_591/193039199_mp4_h264_aac_fhd_7.ts 404 (Not Found)
(anonymous) @ VM528:1
loadInternal @ xhr-loader.js:80
load @ xhr-loader.js:39
onFragLoading @ fragment-loader.js:76
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
_loadFragmentOrKey @ stream-controller.js:513
_fetchPayloadOrEos @ stream-controller.js:302
_doTickIdle @ stream-controller.js:254
doTick @ stream-controller.js:127
tick @ task-loop.js:58
onLevelLoaded @ stream-controller.js:951
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
_handlePlaylistLoaded @ playlist-loader.js:463
_handleTrackOrLevelPlaylist @ playlist-loader.js:379
loadsuccess @ playlist-loader.js:246
readystatechange @ xhr-loader.js:117
XMLHttpRequest.send (async)
(anonymous) @ VM528:1
loadInternal @ xhr-loader.js:80
load @ xhr-loader.js:39
load @ playlist-loader.js:218
onLevelLoading @ playlist-loader.js:143
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:84
trigger @ hls.js:81
setLevelInternal @ level-controller.js:188
set @ level-controller.js:162
set @ level-controller.js:413
set @ hls.js:245
_doTickIdle @ stream-controller.js:217
doTick @ stream-controller.js:127
tick @ task-loop.js:58
_checkAppendedParsed @ stream-controller.js:1289
onBufferAppended @ stream-controller.js:1263
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
onSBUpdateEnd @ buffer-controller.js:223
15:24:06.710 logger.js:37 [error] > 404 while loading https://video-dev.github.io/streams/x36xhzz/url_8/url_591/193039199_mp4_h264_aac_fhd_7.ts
(anonymous) @ logger.js:37
readystatechange @ xhr-loader.js:121
XMLHttpRequest.send (async)
(anonymous) @ VM528:1
loadInternal @ xhr-loader.js:80
load @ xhr-loader.js:39
onFragLoading @ fragment-loader.js:76
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
_loadFragmentOrKey @ stream-controller.js:513
_fetchPayloadOrEos @ stream-controller.js:302
_doTickIdle @ stream-controller.js:254
doTick @ stream-controller.js:127
tick @ task-loop.js:58
onLevelLoaded @ stream-controller.js:951
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
_handlePlaylistLoaded @ playlist-loader.js:463
_handleTrackOrLevelPlaylist @ playlist-loader.js:379
loadsuccess @ playlist-loader.js:246
readystatechange @ xhr-loader.js:117
XMLHttpRequest.send (async)
(anonymous) @ VM528:1
loadInternal @ xhr-loader.js:80
load @ xhr-loader.js:39
load @ playlist-loader.js:218
onLevelLoading @ playlist-loader.js:143
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:84
trigger @ hls.js:81
setLevelInternal @ level-controller.js:188
set @ level-controller.js:162
set @ level-controller.js:413
set @ hls.js:245
_doTickIdle @ stream-controller.js:217
doTick @ stream-controller.js:127
tick @ task-loop.js:58
_checkAppendedParsed @ stream-controller.js:1289
onBufferAppended @ stream-controller.js:1263
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
onSBUpdateEnd @ buffer-controller.js:223
15:24:06.711 VM528:1 XHR failed loading: GET "https://video-dev.github.io/streams/x36xhzz/url_8/url_591/193039199_mp4_h264_aac_fhd_7.ts".
(anonymous) @ VM528:1
loadInternal @ xhr-loader.js:80
load @ xhr-loader.js:39
onFragLoading @ fragment-loader.js:76
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
_loadFragmentOrKey @ stream-controller.js:513
_fetchPayloadOrEos @ stream-controller.js:302
_doTickIdle @ stream-controller.js:254
doTick @ stream-controller.js:127
tick @ task-loop.js:58
onLevelLoaded @ stream-controller.js:951
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
_handlePlaylistLoaded @ playlist-loader.js:463
_handleTrackOrLevelPlaylist @ playlist-loader.js:379
loadsuccess @ playlist-loader.js:246
readystatechange @ xhr-loader.js:117
XMLHttpRequest.send (async)
(anonymous) @ VM528:1
loadInternal @ xhr-loader.js:80
load @ xhr-loader.js:39
load @ playlist-loader.js:218
onLevelLoading @ playlist-loader.js:143
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:84
trigger @ hls.js:81
setLevelInternal @ level-controller.js:188
set @ level-controller.js:162
set @ level-controller.js:413
set @ hls.js:245
_doTickIdle @ stream-controller.js:217
doTick @ stream-controller.js:127
tick @ task-loop.js:58
_checkAppendedParsed @ stream-controller.js:1289
onBufferAppended @ stream-controller.js:1263
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
onSBUpdateEnd @ buffer-controller.js:223
15:24:06.711 logger.js:37 [warn] > level controller, fragLoadError: switch to 3
(anonymous) @ logger.js:37
recoverLevel @ level-controller.js:334
onError @ level-controller.js:276
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
loaderror @ fragment-loader.js:93
readystatechange @ xhr-loader.js:122
XMLHttpRequest.send (async)
(anonymous) @ VM528:1
loadInternal @ xhr-loader.js:80
load @ xhr-loader.js:39
onFragLoading @ fragment-loader.js:76
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
_loadFragmentOrKey @ stream-controller.js:513
_fetchPayloadOrEos @ stream-controller.js:302
_doTickIdle @ stream-controller.js:254
doTick @ stream-controller.js:127
tick @ task-loop.js:58
onLevelLoaded @ stream-controller.js:951
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
_handlePlaylistLoaded @ playlist-loader.js:463
_handleTrackOrLevelPlaylist @ playlist-loader.js:379
loadsuccess @ playlist-loader.js:246
readystatechange @ xhr-loader.js:117
XMLHttpRequest.send (async)
(anonymous) @ VM528:1
loadInternal @ xhr-loader.js:80
load @ xhr-loader.js:39
load @ playlist-loader.js:218
onLevelLoading @ playlist-loader.js:143
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:84
trigger @ hls.js:81
setLevelInternal @ level-controller.js:188
set @ level-controller.js:162
set @ level-controller.js:413
set @ hls.js:245
_doTickIdle @ stream-controller.js:217
doTick @ stream-controller.js:127
tick @ task-loop.js:58
_checkAppendedParsed @ stream-controller.js:1289
onBufferAppended @ stream-controller.js:1263
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
onSBUpdateEnd @ buffer-controller.js:223
15:24:06.712 logger.js:37 [warn] > mediaController: frag loading failed, retry in 1000 ms
(anonymous) @ logger.js:37
onError @ stream-controller.js:1314
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
loaderror @ fragment-loader.js:93
readystatechange @ xhr-loader.js:122
XMLHttpRequest.send (async)
(anonymous) @ VM528:1
loadInternal @ xhr-loader.js:80
load @ xhr-loader.js:39
onFragLoading @ fragment-loader.js:76
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
_loadFragmentOrKey @ stream-controller.js:513
_fetchPayloadOrEos @ stream-controller.js:302
_doTickIdle @ stream-controller.js:254
doTick @ stream-controller.js:127
tick @ task-loop.js:58
onLevelLoaded @ stream-controller.js:951
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
_handlePlaylistLoaded @ playlist-loader.js:463
_handleTrackOrLevelPlaylist @ playlist-loader.js:379
loadsuccess @ playlist-loader.js:246
readystatechange @ xhr-loader.js:117
XMLHttpRequest.send (async)
(anonymous) @ VM528:1
loadInternal @ xhr-loader.js:80
load @ xhr-loader.js:39
load @ playlist-loader.js:218
onLevelLoading @ playlist-loader.js:143
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:84
trigger @ hls.js:81
setLevelInternal @ level-controller.js:188
set @ level-controller.js:162
set @ level-controller.js:413
set @ hls.js:245
_doTickIdle @ stream-controller.js:217
doTick @ stream-controller.js:127
tick @ task-loop.js:58
_checkAppendedParsed @ stream-controller.js:1289
onBufferAppended @ stream-controller.js:1263
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
onSBUpdateEnd @ buffer-controller.js:223
15:24:06.713 logger.js:37 [log] > main stream:FRAG_LOADING->FRAG_LOADING_WAITING_RETRY
15:24:06.714 main.js:496 {type: "networkError", details: "fragLoadError", fatal: false, frag: Fragment, response: {…}, …}
(anonymous) @ main.js:496
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
loaderror @ fragment-loader.js:93
readystatechange @ xhr-loader.js:122
XMLHttpRequest.send (async)
(anonymous) @ VM528:1
loadInternal @ xhr-loader.js:80
load @ xhr-loader.js:39
onFragLoading @ fragment-loader.js:76
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
_loadFragmentOrKey @ stream-controller.js:513
_fetchPayloadOrEos @ stream-controller.js:302
_doTickIdle @ stream-controller.js:254
doTick @ stream-controller.js:127
tick @ task-loop.js:58
onLevelLoaded @ stream-controller.js:951
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
_handlePlaylistLoaded @ playlist-loader.js:463
_handleTrackOrLevelPlaylist @ playlist-loader.js:379
loadsuccess @ playlist-loader.js:246
readystatechange @ xhr-loader.js:117
XMLHttpRequest.send (async)
(anonymous) @ VM528:1
loadInternal @ xhr-loader.js:80
load @ xhr-loader.js:39
load @ playlist-loader.js:218
onLevelLoading @ playlist-loader.js:143
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:84
trigger @ hls.js:81
setLevelInternal @ level-controller.js:188
set @ level-controller.js:162
set @ level-controller.js:413
set @ hls.js:245
_doTickIdle @ stream-controller.js:217
doTick @ stream-controller.js:127
tick @ task-loop.js:58
_checkAppendedParsed @ stream-controller.js:1289
onBufferAppended @ stream-controller.js:1263
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
onSBUpdateEnd @ buffer-controller.js:223
15:24:07.715 logger.js:37 [log] > mediaController: retryDate reached, switch back to IDLE state
15:24:07.716 logger.js:37 [log] > main stream:FRAG_LOADING_WAITING_RETRY->IDLE
15:24:07.816 logger.js:37 [log] > Loading 1 of [0 ,63],level 3, currentTime:1.371,bufferEnd:10.000
15:24:07.817 logger.js:37 [warn] > abort previous fragment loader for type: main
(anonymous) @ logger.js:37
onFragLoading @ fragment-loader.js:43
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
_loadFragmentOrKey @ stream-controller.js:513
_fetchPayloadOrEos @ stream-controller.js:302
_doTickIdle @ stream-controller.js:254
doTick @ stream-controller.js:127
tick @ task-loop.js:58
setInterval (async)
(anonymous) @ task-loop.js:33
setInterval @ hls.js:7904
startLoad @ stream-controller.js:69
(anonymous) @ hls.js:178
startLoad @ hls.js:178
onManifestParsed @ stream-controller.js:881
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
onManifestLoaded @ level-controller.js:129
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
_handleMasterPlaylist @ playlist-loader.js:306
loadsuccess @ playlist-loader.js:248
readystatechange @ xhr-loader.js:117
XMLHttpRequest.send (async)
(anonymous) @ VM528:1
loadInternal @ xhr-loader.js:80
load @ xhr-loader.js:39
load @ playlist-loader.js:218
onManifestLoading @ playlist-loader.js:139
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
loadSource @ hls.js:173
loadSelectedStream @ main.js:197
(anonymous) @ main.js:69
dispatch @ jquery.min.js:3
r.handle @ jquery.min.js:3
15:24:07.818 logger.js:37 [log] > main stream:IDLE->FRAG_LOADING
15:24:09.259 VM528:1 XHR finished loading: GET "https://video-dev.github.io/streams/x36xhzz/url_0/url_463/193039199_mp4_h264_aac_hd_7.ts".
(anonymous) @ VM528:1
loadInternal @ xhr-loader.js:80
load @ xhr-loader.js:39
onFragLoading @ fragment-loader.js:76
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
_loadFragmentOrKey @ stream-controller.js:513
_fetchPayloadOrEos @ stream-controller.js:302
_doTickIdle @ stream-controller.js:254
doTick @ stream-controller.js:127
tick @ task-loop.js:58
setInterval (async)
(anonymous) @ task-loop.js:33
setInterval @ hls.js:7904
startLoad @ stream-controller.js:69
(anonymous) @ hls.js:178
startLoad @ hls.js:178
onManifestParsed @ stream-controller.js:881
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
onManifestLoaded @ level-controller.js:129
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
_handleMasterPlaylist @ playlist-loader.js:306
loadsuccess @ playlist-loader.js:248
readystatechange @ xhr-loader.js:117
XMLHttpRequest.send (async)
(anonymous) @ VM528:1
loadInternal @ xhr-loader.js:80
load @ xhr-loader.js:39
load @ playlist-loader.js:218
onManifestLoading @ playlist-loader.js:139
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
loadSource @ hls.js:173
loadSelectedStream @ main.js:197
(anonymous) @ main.js:69
dispatch @ jquery.min.js:3
r.handle @ jquery.min.js:3
15:24:09.259 logger.js:37 [log] > Loaded  1 of [0 ,63],level 3
15:24:09.259 logger.js:37 [log] > main stream:FRAG_LOADING->PARSING
15:24:09.260 logger.js:37 [log] > Parsing 1 of [0 ,63],level 3, cc 0
15:24:09.314 logger.js:37 [log] > Parsed audio,PTS:[10.018,20.002],DTS:[10.018/20.002],nb:430,dropped:0
15:24:09.318 logger.js:37 [log] > Parsed video,PTS:[10.033,20.033],DTS:[10.000/20.000],nb:600,dropped:0
15:24:09.319 logger.js:37 [log] > main stream:PARSING->PARSED
15:24:09.334 logger.js:37 [log] > main buffered : [0.010,20.000]
15:24:09.335 logger.js:37 [log] > latency/loading/parsing/append/kbps:117/1318/66/16/22063
15:24:09.336 logger.js:37 [log] > main stream:PARSED->IDLE
15:24:09.336 logger.js:37 [log] > switching to level 4
15:24:09.337 logger.js:37 [log] > Loading 2 of [0 ,63],level 4, currentTime:2.890,bufferEnd:20.000
15:24:09.337 logger.js:37 [log] > main stream:IDLE->FRAG_LOADING
15:24:09.529 VM528:1 GET https://video-dev.github.io/streams/x36xhzz/url_8/url_592/193039199_mp4_h264_aac_fhd_7.ts 404 (Not Found)
(anonymous) @ VM528:1
loadInternal @ xhr-loader.js:80
load @ xhr-loader.js:39
onFragLoading @ fragment-loader.js:76
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
_loadFragmentOrKey @ stream-controller.js:513
_fetchPayloadOrEos @ stream-controller.js:302
_doTickIdle @ stream-controller.js:254
doTick @ stream-controller.js:127
tick @ task-loop.js:58
_checkAppendedParsed @ stream-controller.js:1289
onBufferAppended @ stream-controller.js:1263
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
onSBUpdateEnd @ buffer-controller.js:223
15:24:09.530 logger.js:37 [error] > 404 while loading https://video-dev.github.io/streams/x36xhzz/url_8/url_592/193039199_mp4_h264_aac_fhd_7.ts
(anonymous) @ logger.js:37
readystatechange @ xhr-loader.js:121
XMLHttpRequest.send (async)
(anonymous) @ VM528:1
loadInternal @ xhr-loader.js:80
load @ xhr-loader.js:39
onFragLoading @ fragment-loader.js:76
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
_loadFragmentOrKey @ stream-controller.js:513
_fetchPayloadOrEos @ stream-controller.js:302
_doTickIdle @ stream-controller.js:254
doTick @ stream-controller.js:127
tick @ task-loop.js:58
_checkAppendedParsed @ stream-controller.js:1289
onBufferAppended @ stream-controller.js:1263
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
onSBUpdateEnd @ buffer-controller.js:223
15:24:09.531 logger.js:37 [warn] > level controller, fragLoadError: switch to 3
(anonymous) @ logger.js:37
recoverLevel @ level-controller.js:334
onError @ level-controller.js:276
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
loaderror @ fragment-loader.js:93
readystatechange @ xhr-loader.js:122
XMLHttpRequest.send (async)
(anonymous) @ VM528:1
loadInternal @ xhr-loader.js:80
load @ xhr-loader.js:39
onFragLoading @ fragment-loader.js:76
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
_loadFragmentOrKey @ stream-controller.js:513
_fetchPayloadOrEos @ stream-controller.js:302
_doTickIdle @ stream-controller.js:254
doTick @ stream-controller.js:127
tick @ task-loop.js:58
_checkAppendedParsed @ stream-controller.js:1289
onBufferAppended @ stream-controller.js:1263
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
onSBUpdateEnd @ buffer-controller.js:223
15:24:09.532 VM528:1 XHR failed loading: GET "https://video-dev.github.io/streams/x36xhzz/url_8/url_592/193039199_mp4_h264_aac_fhd_7.ts".
(anonymous) @ VM528:1
loadInternal @ xhr-loader.js:80
load @ xhr-loader.js:39
onFragLoading @ fragment-loader.js:76
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
_loadFragmentOrKey @ stream-controller.js:513
_fetchPayloadOrEos @ stream-controller.js:302
_doTickIdle @ stream-controller.js:254
doTick @ stream-controller.js:127
tick @ task-loop.js:58
_checkAppendedParsed @ stream-controller.js:1289
onBufferAppended @ stream-controller.js:1263
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
onSBUpdateEnd @ buffer-controller.js:223
15:24:09.532 logger.js:37 [warn] > mediaController: frag loading failed, retry in 1000 ms
(anonymous) @ logger.js:37
onError @ stream-controller.js:1314
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
loaderror @ fragment-loader.js:93
readystatechange @ xhr-loader.js:122
XMLHttpRequest.send (async)
(anonymous) @ VM528:1
loadInternal @ xhr-loader.js:80
load @ xhr-loader.js:39
onFragLoading @ fragment-loader.js:76
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
_loadFragmentOrKey @ stream-controller.js:513
_fetchPayloadOrEos @ stream-controller.js:302
_doTickIdle @ stream-controller.js:254
doTick @ stream-controller.js:127
tick @ task-loop.js:58
_checkAppendedParsed @ stream-controller.js:1289
onBufferAppended @ stream-controller.js:1263
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
onSBUpdateEnd @ buffer-controller.js:223
15:24:09.532 logger.js:37 [log] > main stream:FRAG_LOADING->FRAG_LOADING_WAITING_RETRY
15:24:09.533 main.js:496 {type: "networkError", details: "fragLoadError", fatal: false, frag: Fragment, response: {…}, …}
(anonymous) @ main.js:496
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
loaderror @ fragment-loader.js:93
readystatechange @ xhr-loader.js:122
XMLHttpRequest.send (async)
(anonymous) @ VM528:1
loadInternal @ xhr-loader.js:80
load @ xhr-loader.js:39
onFragLoading @ fragment-loader.js:76
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
_loadFragmentOrKey @ stream-controller.js:513
_fetchPayloadOrEos @ stream-controller.js:302
_doTickIdle @ stream-controller.js:254
doTick @ stream-controller.js:127
tick @ task-loop.js:58
_checkAppendedParsed @ stream-controller.js:1289
onBufferAppended @ stream-controller.js:1263
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
onSBUpdateEnd @ buffer-controller.js:223
15:24:10.615 logger.js:37 [log] > mediaController: retryDate reached, switch back to IDLE state
15:24:10.616 logger.js:37 [log] > main stream:FRAG_LOADING_WAITING_RETRY->IDLE
15:24:10.715 logger.js:37 [log] > Loading 2 of [0 ,63],level 3, currentTime:4.270,bufferEnd:20.000
15:24:10.716 logger.js:37 [warn] > abort previous fragment loader for type: main
(anonymous) @ logger.js:37
onFragLoading @ fragment-loader.js:43
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
_loadFragmentOrKey @ stream-controller.js:513
_fetchPayloadOrEos @ stream-controller.js:302
_doTickIdle @ stream-controller.js:254
doTick @ stream-controller.js:127
tick @ task-loop.js:58
setInterval (async)
(anonymous) @ task-loop.js:33
setInterval @ hls.js:7904
startLoad @ stream-controller.js:69
(anonymous) @ hls.js:178
startLoad @ hls.js:178
onManifestParsed @ stream-controller.js:881
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
onManifestLoaded @ level-controller.js:129
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
_handleMasterPlaylist @ playlist-loader.js:306
loadsuccess @ playlist-loader.js:248
readystatechange @ xhr-loader.js:117
XMLHttpRequest.send (async)
(anonymous) @ VM528:1
loadInternal @ xhr-loader.js:80
load @ xhr-loader.js:39
load @ playlist-loader.js:218
onManifestLoading @ playlist-loader.js:139
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
loadSource @ hls.js:173
loadSelectedStream @ main.js:197
(anonymous) @ main.js:69
dispatch @ jquery.min.js:3
r.handle @ jquery.min.js:3
15:24:10.718 logger.js:37 [log] > main stream:IDLE->FRAG_LOADING
15:24:11.527 logger.js:37 [log] > Loaded  2 of [0 ,63],level 3
15:24:11.528 VM528:1 XHR finished loading: GET "https://video-dev.github.io/streams/x36xhzz/url_0/url_464/193039199_mp4_h264_aac_hd_7.ts".
(anonymous) @ VM528:1
loadInternal @ xhr-loader.js:80
load @ xhr-loader.js:39
onFragLoading @ fragment-loader.js:76
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
_loadFragmentOrKey @ stream-controller.js:513
_fetchPayloadOrEos @ stream-controller.js:302
_doTickIdle @ stream-controller.js:254
doTick @ stream-controller.js:127
tick @ task-loop.js:58
setInterval (async)
(anonymous) @ task-loop.js:33
setInterval @ hls.js:7904
startLoad @ stream-controller.js:69
(anonymous) @ hls.js:178
startLoad @ hls.js:178
onManifestParsed @ stream-controller.js:881
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
onManifestLoaded @ level-controller.js:129
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
_handleMasterPlaylist @ playlist-loader.js:306
loadsuccess @ playlist-loader.js:248
readystatechange @ xhr-loader.js:117
XMLHttpRequest.send (async)
(anonymous) @ VM528:1
loadInternal @ xhr-loader.js:80
load @ xhr-loader.js:39
load @ playlist-loader.js:218
onManifestLoading @ playlist-loader.js:139
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
loadSource @ hls.js:173
loadSelectedStream @ main.js:197
(anonymous) @ main.js:69
dispatch @ jquery.min.js:3
r.handle @ jquery.min.js:3
15:24:11.528 logger.js:37 [log] > main stream:FRAG_LOADING->PARSING
15:24:11.528 logger.js:37 [log] > Parsing 2 of [0 ,63],level 3, cc 0
15:24:11.550 logger.js:37 [log] > Parsed audio,PTS:[20.002,30.010],DTS:[20.002/30.010],nb:431,dropped:0
15:24:11.555 logger.js:37 [log] > Parsed video,PTS:[20.033,30.000],DTS:[20.000/30.000],nb:600,dropped:0
15:24:11.555 logger.js:37 [log] > main stream:PARSING->PARSED
15:24:11.564 logger.js:37 [log] > main buffered : [0.010,30.000]
15:24:11.564 logger.js:37 [log] > latency/loading/parsing/append/kbps:115/693/30/9/22759
15:24:11.565 logger.js:37 [log] > main stream:PARSED->IDLE
15:24:11.565 logger.js:37 [log] > switching to level 4
15:24:11.566 logger.js:37 [log] > Loading 3 of [0 ,63],level 4, currentTime:5.119,bufferEnd:30.000
15:24:11.567 logger.js:37 [log] > main stream:IDLE->FRAG_LOADING
15:24:11.764 VM528:1 GET https://video-dev.github.io/streams/x36xhzz/url_8/url_593/193039199_mp4_h264_aac_fhd_7.ts 404 (Not Found)
(anonymous) @ VM528:1
loadInternal @ xhr-loader.js:80
load @ xhr-loader.js:39
onFragLoading @ fragment-loader.js:76
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
_loadFragmentOrKey @ stream-controller.js:513
_fetchPayloadOrEos @ stream-controller.js:302
_doTickIdle @ stream-controller.js:254
doTick @ stream-controller.js:127
tick @ task-loop.js:58
_checkAppendedParsed @ stream-controller.js:1289
onBufferAppended @ stream-controller.js:1263
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
onSBUpdateEnd @ buffer-controller.js:223
15:24:11.765 logger.js:37 [error] > 404 while loading https://video-dev.github.io/streams/x36xhzz/url_8/url_593/193039199_mp4_h264_aac_fhd_7.ts
(anonymous) @ logger.js:37
readystatechange @ xhr-loader.js:121
XMLHttpRequest.send (async)
(anonymous) @ VM528:1
loadInternal @ xhr-loader.js:80
load @ xhr-loader.js:39
onFragLoading @ fragment-loader.js:76
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
_loadFragmentOrKey @ stream-controller.js:513
_fetchPayloadOrEos @ stream-controller.js:302
_doTickIdle @ stream-controller.js:254
doTick @ stream-controller.js:127
tick @ task-loop.js:58
_checkAppendedParsed @ stream-controller.js:1289
onBufferAppended @ stream-controller.js:1263
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
onSBUpdateEnd @ buffer-controller.js:223
15:24:11.766 logger.js:37 [warn] > level controller, fragLoadError: switch to 3
(anonymous) @ logger.js:37
recoverLevel @ level-controller.js:334
onError @ level-controller.js:276
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
loaderror @ fragment-loader.js:93
readystatechange @ xhr-loader.js:122
XMLHttpRequest.send (async)
(anonymous) @ VM528:1
loadInternal @ xhr-loader.js:80
load @ xhr-loader.js:39
onFragLoading @ fragment-loader.js:76
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
_loadFragmentOrKey @ stream-controller.js:513
_fetchPayloadOrEos @ stream-controller.js:302
_doTickIdle @ stream-controller.js:254
doTick @ stream-controller.js:127
tick @ task-loop.js:58
_checkAppendedParsed @ stream-controller.js:1289
onBufferAppended @ stream-controller.js:1263
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
onSBUpdateEnd @ buffer-controller.js:223
15:24:11.767 VM528:1 XHR failed loading: GET "https://video-dev.github.io/streams/x36xhzz/url_8/url_593/193039199_mp4_h264_aac_fhd_7.ts".
(anonymous) @ VM528:1
loadInternal @ xhr-loader.js:80
load @ xhr-loader.js:39
onFragLoading @ fragment-loader.js:76
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
_loadFragmentOrKey @ stream-controller.js:513
_fetchPayloadOrEos @ stream-controller.js:302
_doTickIdle @ stream-controller.js:254
doTick @ stream-controller.js:127
tick @ task-loop.js:58
_checkAppendedParsed @ stream-controller.js:1289
onBufferAppended @ stream-controller.js:1263
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
onSBUpdateEnd @ buffer-controller.js:223
15:24:11.767 logger.js:37 [warn] > mediaController: frag loading failed, retry in 1000 ms
(anonymous) @ logger.js:37
onError @ stream-controller.js:1314
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
loaderror @ fragment-loader.js:93
readystatechange @ xhr-loader.js:122
XMLHttpRequest.send (async)
(anonymous) @ VM528:1
loadInternal @ xhr-loader.js:80
load @ xhr-loader.js:39
onFragLoading @ fragment-loader.js:76
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
_loadFragmentOrKey @ stream-controller.js:513
_fetchPayloadOrEos @ stream-controller.js:302
_doTickIdle @ stream-controller.js:254
doTick @ stream-controller.js:127
tick @ task-loop.js:58
_checkAppendedParsed @ stream-controller.js:1289
onBufferAppended @ stream-controller.js:1263
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
onSBUpdateEnd @ buffer-controller.js:223
15:24:11.768 logger.js:37 [log] > main stream:FRAG_LOADING->FRAG_LOADING_WAITING_RETRY
15:24:11.768 main.js:496 {type: "networkError", details: "fragLoadError", fatal: false, frag: Fragment, response: {…}, …}
(anonymous) @ main.js:496
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
loaderror @ fragment-loader.js:93
readystatechange @ xhr-loader.js:122
XMLHttpRequest.send (async)
(anonymous) @ VM528:1
loadInternal @ xhr-loader.js:80
load @ xhr-loader.js:39
onFragLoading @ fragment-loader.js:76
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
_loadFragmentOrKey @ stream-controller.js:513
_fetchPayloadOrEos @ stream-controller.js:302
_doTickIdle @ stream-controller.js:254
doTick @ stream-controller.js:127
tick @ task-loop.js:58
_checkAppendedParsed @ stream-controller.js:1289
onBufferAppended @ stream-controller.js:1263
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
onSBUpdateEnd @ buffer-controller.js:223
15:24:12.815 logger.js:37 [log] > mediaController: retryDate reached, switch back to IDLE state
15:24:12.816 logger.js:37 [log] > main stream:FRAG_LOADING_WAITING_RETRY->IDLE
15:24:12.915 logger.js:37 [log] > Loading 3 of [0 ,63],level 3, currentTime:6.470,bufferEnd:30.000
15:24:12.916 logger.js:37 [warn] > abort previous fragment loader for type: main
(anonymous) @ logger.js:37
onFragLoading @ fragment-loader.js:43
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
_loadFragmentOrKey @ stream-controller.js:513
_fetchPayloadOrEos @ stream-controller.js:302
_doTickIdle @ stream-controller.js:254
doTick @ stream-controller.js:127
tick @ task-loop.js:58
setInterval (async)
(anonymous) @ task-loop.js:33
setInterval @ hls.js:7904
startLoad @ stream-controller.js:69
(anonymous) @ hls.js:178
startLoad @ hls.js:178
onManifestParsed @ stream-controller.js:881
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
onManifestLoaded @ level-controller.js:129
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
_handleMasterPlaylist @ playlist-loader.js:306
loadsuccess @ playlist-loader.js:248
readystatechange @ xhr-loader.js:117
XMLHttpRequest.send (async)
(anonymous) @ VM528:1
loadInternal @ xhr-loader.js:80
load @ xhr-loader.js:39
load @ playlist-loader.js:218
onManifestLoading @ playlist-loader.js:139
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
loadSource @ hls.js:173
loadSelectedStream @ main.js:197
(anonymous) @ main.js:69
dispatch @ jquery.min.js:3
r.handle @ jquery.min.js:3
15:24:12.918 logger.js:37 [log] > main stream:IDLE->FRAG_LOADING
15:24:14.363 logger.js:37 [log] > Loaded  3 of [0 ,63],level 3
15:24:14.364 VM528:1 XHR finished loading: GET "https://video-dev.github.io/streams/x36xhzz/url_0/url_465/193039199_mp4_h264_aac_hd_7.ts".
(anonymous) @ VM528:1
loadInternal @ xhr-loader.js:80
load @ xhr-loader.js:39
onFragLoading @ fragment-loader.js:76
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
_loadFragmentOrKey @ stream-controller.js:513
_fetchPayloadOrEos @ stream-controller.js:302
_doTickIdle @ stream-controller.js:254
doTick @ stream-controller.js:127
tick @ task-loop.js:58
setInterval (async)
(anonymous) @ task-loop.js:33
setInterval @ hls.js:7904
startLoad @ stream-controller.js:69
(anonymous) @ hls.js:178
startLoad @ hls.js:178
onManifestParsed @ stream-controller.js:881
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
onManifestLoaded @ level-controller.js:129
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
_handleMasterPlaylist @ playlist-loader.js:306
loadsuccess @ playlist-loader.js:248
readystatechange @ xhr-loader.js:117
XMLHttpRequest.send (async)
(anonymous) @ VM528:1
loadInternal @ xhr-loader.js:80
load @ xhr-loader.js:39
load @ playlist-loader.js:218
onManifestLoading @ playlist-loader.js:139
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
loadSource @ hls.js:173
loadSelectedStream @ main.js:197
(anonymous) @ main.js:69
dispatch @ jquery.min.js:3
r.handle @ jquery.min.js:3
15:24:14.364 logger.js:37 [log] > main stream:FRAG_LOADING->PARSING
15:24:14.365 logger.js:37 [log] > Parsing 3 of [0 ,63],level 3, cc 0
15:24:14.426 logger.js:37 [log] > Parsed audio,PTS:[30.010,40.018],DTS:[30.010/40.018],nb:431,dropped:0
15:24:14.431 logger.js:37 [log] > Parsed video,PTS:[30.033,40.000],DTS:[30.000/40.000],nb:600,dropped:0
15:24:14.431 logger.js:37 [log] > main stream:PARSING->PARSED
15:24:14.450 logger.js:37 [log] > main buffered : [0.010,40.000]
15:24:14.451 logger.js:37 [log] > latency/loading/parsing/append/kbps:121/1320/72/19/23972
15:24:14.451 logger.js:37 [log] > main stream:PARSED->IDLE
15:24:14.452 logger.js:37 [log] > switching to level 4
15:24:14.453 logger.js:37 [log] > Loading 4 of [0 ,63],level 4, currentTime:8.006,bufferEnd:40.000
15:24:14.453 logger.js:37 [log] > main stream:IDLE->FRAG_LOADING
15:24:14.663 VM528:1 GET https://video-dev.github.io/streams/x36xhzz/url_8/url_594/193039199_mp4_h264_aac_fhd_7.ts 404 (Not Found)
(anonymous) @ VM528:1
loadInternal @ xhr-loader.js:80
load @ xhr-loader.js:39
onFragLoading @ fragment-loader.js:76
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
_loadFragmentOrKey @ stream-controller.js:513
_fetchPayloadOrEos @ stream-controller.js:302
_doTickIdle @ stream-controller.js:254
doTick @ stream-controller.js:127
tick @ task-loop.js:58
_checkAppendedParsed @ stream-controller.js:1289
onBufferAppended @ stream-controller.js:1263
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
onSBUpdateEnd @ buffer-controller.js:223
15:24:14.664 logger.js:37 [error] > 404 while loading https://video-dev.github.io/streams/x36xhzz/url_8/url_594/193039199_mp4_h264_aac_fhd_7.ts
(anonymous) @ logger.js:37
readystatechange @ xhr-loader.js:121
XMLHttpRequest.send (async)
(anonymous) @ VM528:1
loadInternal @ xhr-loader.js:80
load @ xhr-loader.js:39
onFragLoading @ fragment-loader.js:76
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
_loadFragmentOrKey @ stream-controller.js:513
_fetchPayloadOrEos @ stream-controller.js:302
_doTickIdle @ stream-controller.js:254
doTick @ stream-controller.js:127
tick @ task-loop.js:58
_checkAppendedParsed @ stream-controller.js:1289
onBufferAppended @ stream-controller.js:1263
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
onSBUpdateEnd @ buffer-controller.js:223
15:24:14.665 VM528:1 XHR failed loading: GET "https://video-dev.github.io/streams/x36xhzz/url_8/url_594/193039199_mp4_h264_aac_fhd_7.ts".
(anonymous) @ VM528:1
loadInternal @ xhr-loader.js:80
load @ xhr-loader.js:39
onFragLoading @ fragment-loader.js:76
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
_loadFragmentOrKey @ stream-controller.js:513
_fetchPayloadOrEos @ stream-controller.js:302
_doTickIdle @ stream-controller.js:254
doTick @ stream-controller.js:127
tick @ task-loop.js:58
_checkAppendedParsed @ stream-controller.js:1289
onBufferAppended @ stream-controller.js:1263
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
onSBUpdateEnd @ buffer-controller.js:223
15:24:14.665 logger.js:37 [warn] > level controller, fragLoadError: switch to 3
(anonymous) @ logger.js:37
recoverLevel @ level-controller.js:334
onError @ level-controller.js:276
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
loaderror @ fragment-loader.js:93
readystatechange @ xhr-loader.js:122
XMLHttpRequest.send (async)
(anonymous) @ VM528:1
loadInternal @ xhr-loader.js:80
load @ xhr-loader.js:39
onFragLoading @ fragment-loader.js:76
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
_loadFragmentOrKey @ stream-controller.js:513
_fetchPayloadOrEos @ stream-controller.js:302
_doTickIdle @ stream-controller.js:254
doTick @ stream-controller.js:127
tick @ task-loop.js:58
_checkAppendedParsed @ stream-controller.js:1289
onBufferAppended @ stream-controller.js:1263
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
onSBUpdateEnd @ buffer-controller.js:223
15:24:14.665 logger.js:37 [warn] > mediaController: frag loading failed, retry in 1000 ms
(anonymous) @ logger.js:37
onError @ stream-controller.js:1314
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
loaderror @ fragment-loader.js:93
readystatechange @ xhr-loader.js:122
XMLHttpRequest.send (async)
(anonymous) @ VM528:1
loadInternal @ xhr-loader.js:80
load @ xhr-loader.js:39
onFragLoading @ fragment-loader.js:76
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
_loadFragmentOrKey @ stream-controller.js:513
_fetchPayloadOrEos @ stream-controller.js:302
_doTickIdle @ stream-controller.js:254
doTick @ stream-controller.js:127
tick @ task-loop.js:58
_checkAppendedParsed @ stream-controller.js:1289
onBufferAppended @ stream-controller.js:1263
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
onSBUpdateEnd @ buffer-controller.js:223
15:24:14.666 logger.js:37 [log] > main stream:FRAG_LOADING->FRAG_LOADING_WAITING_RETRY
15:24:14.666 main.js:496 {type: "networkError", details: "fragLoadError", fatal: false, frag: Fragment, response: {…}, …}
(anonymous) @ main.js:496
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
loaderror @ fragment-loader.js:93
readystatechange @ xhr-loader.js:122
XMLHttpRequest.send (async)
(anonymous) @ VM528:1
loadInternal @ xhr-loader.js:80
load @ xhr-loader.js:39
onFragLoading @ fragment-loader.js:76
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
_loadFragmentOrKey @ stream-controller.js:513
_fetchPayloadOrEos @ stream-controller.js:302
_doTickIdle @ stream-controller.js:254
doTick @ stream-controller.js:127
tick @ task-loop.js:58
_checkAppendedParsed @ stream-controller.js:1289
onBufferAppended @ stream-controller.js:1263
onEventGeneric @ event-handler.js:76
onEvent @ event-handler.js:64
EventEmitter.emit @ events.js:96
trigger @ hls.js:81
onSBUpdateEnd @ buffer-controller.js:223
15:24:15.080 logger.js:37 [log] > destroy
15:24:15.080 logger.js:37 [log] > detachMedia
15:24:15.081 logger.js:37 [log] > media source detaching
15:24:15.088 logger.js:37 [log] > main stream:FRAG_LOADING_WAITING_RETRY->STOPPED

@ssreed ssreed mentioned this issue Feb 1, 2018
5 tasks
@johnBartos
Copy link
Collaborator

A few thoughts:

  1. Should we just leave this up to client code? I foresee difficulties in signaling suppressed levels so that corresponding controlbars can update. For example, in the JW fork we've implemented a simple suppression system with a custom levelEmptyError code and a removeLevel api:
if (details === 'levelEmptyError') {
                this.hlsjs.removeLevel(data.level);

Removing the level probably isn't ideal for everyone. However, an API/event-driven approach would allow clients to choose how to handle an unavailable level. One downside is that it requires users to write more code.

  1. Can we do better than a fixed time delay? For live it might make more sense to set it to the average level length, and maybe increment it for each failure. For VOD it probably makes sense to never try again.

@ssreed
Copy link
Contributor Author

ssreed commented Feb 2, 2018

Thanks for the feedback!

  1. As levels are marked it is added to an object like so: https://github.com/video-dev/hls.js/pull/1536/files#diff-dfdf661f3b90cc148d83ce6228105a50R31 Perhaps that object can be exposed so it can be referenced by clients.

  2. That's an interesting proposal, I'd have to think more about it. What would be the incrementing value be? For example, if the average level length for level 4 is 50 and there was 1 error on the level would the delay be 50? Then if there's yet another error on level 4 what would the value be?

@tchakabam
Copy link
Collaborator

Hey, just a quick question at first, what about the HLS built-in fallback functionnality?

We are supporting that. You can have redundant playlists, and when on fails the client blacklists it and fails over to the alternative.

See "Redundant Streams":
https://developer.apple.com/library/content/documentation/NetworkingInternet/Conceptual/StreamingMediaGuide/UsingHTTPLiveStreaming/UsingHTTPLiveStreaming.html#//apple_ref/doc/uid/TP40008332-CH102-SW22

@ssreed
Copy link
Contributor Author

ssreed commented Feb 2, 2018

hey @tchakabam,

The scenario I'm describing is for situations where there aren't any redundant streams in the playlists.

@tchakabam
Copy link
Collaborator

tchakabam commented Feb 3, 2018

Ok, i see, thanks.

@stale
Copy link

stale bot commented Jun 15, 2018

This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions.

@stale stale bot added the Wontfix label Jun 15, 2018
@stale stale bot closed this as completed Jun 22, 2018
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

3 participants