hls.js icon indicating copy to clipboard operation
hls.js copied to clipboard

Reloading same URL using loadSource fails with errors

Open naktinis opened this issue 3 years ago • 9 comments

What version of Hls.js are you using?

1.1.5

What browser (including version) are you using?

Chrome 99.0.4844.83 (Official Build) (x86_64)

What OS (including version) are you using?

macOS 12.3

Test stream

https://gist.githack.com/naktinis/832f23419b4a90a5b0e3756227d32d04/raw/6a1dc4acd0440cd9ae4339d4e7a997d909251d70/hls-reload.html

Configuration

{
  debug: true,
  testBandwidth: false,
  abrEwmaDefaultEstimate: 4500000,
  startLevel: -1,
}

Additional player setup steps

No response

Checklist

  • [X] The issue observed is not already reported by searching on Github under https://github.com/video-dev/hls.js/issues
  • [X] The issue occurs in the stable client (latest release) on https://hls-js.netlify.com/demo and not just on my page
  • [X] The issue occurs in the latest client (main branch) on https://hls-js-dev.netlify.com/demo and not just on my page
  • [X] The stream has correct Access-Control-Allow-Origin headers (CORS)
  • [X] There are no network errors such as 404s in the browser console when trying to play the stream

Steps to reproduce

  1. Load the manifest multiple times with the same Hls instance.

Expected behaviour

The player should reload without errors and choose the quality that matches the estimated bandwidth.

What actually happened?

The player produces errors:

  1. [warn] > [buffer-controller]: Failed to reset the video buffer DOMException: Failed to execute 'removeSourceBuffer' on 'MediaSource': The SourceBuffer provided is not contained in this MediaSource.
  2. [audio-stream-controller]: Error: init load aborted

Sometimes it still loads after a while, but when it does, it drops the quality initially (for the first fragment or so), and then recovers. Initial load after page refresh always serves the higher quality on my connection, so it really seems to have to do with these errors.

Console output

hls.ts:310 [log] > attachMedia
buffer-controller.ts:742 [log] > [buffer-controller]: Media source opened
base-stream-controller.ts:1381 [log] > [subtitle-stream-controller]: STOPPED->IDLE
hls.ts:371 [log] > stopLoad
base-stream-controller.ts:1381 [log] > [subtitle-stream-controller]: IDLE->STOPPED
hls.ts:339 [log] > loadSource:https://cdn.muse.ai/w/eefda2e5553e95a62784a066b8c31dd5c5d6c3555cce3b38c5c4728604ac96ed/videos/hls.m3u8
stream-controller.ts:539 [log] > [stream-controller]: Trigger BUFFER_RESET
level-controller.ts:172 [log] > [level-controller]: manifest loaded, 10 level(s) found, first bitrate: 468219
buffer-controller.ts:136 [log] > 2 bufferCodec event(s) expected
hls.ts:361 [log] > startLoad(-1)
level-controller.ts:251 [log] > [level-controller]: switching to level 5 from -1
audio-track-controller.ts:134 [log] > [audio-track-controller]: Updating audio tracks, 1 track(s) found in "audio-1" group-id
audio-track-controller.ts:185 [log] > [audio-track-controller]: Now switching to audio-track index 0
base-stream-controller.ts:1381 [log] > [audio-stream-controller]: STOPPED->IDLE
base-stream-controller.ts:1381 [log] > [audio-stream-controller]: IDLE->WAITING_TRACK
level-controller.ts:524 [log] > [level-controller]: Attempt loading level index 5 with URL-id 0 https://cdn.muse.ai/w/eefda2e5553e95a62784a066b8c31dd5c5d6c3555cce3b38c5c4728604ac96ed/videos/hls-video-2.m3u8
base-stream-controller.ts:1381 [log] > [stream-controller]: STOPPED->IDLE
audio-track-controller.ts:258 [log] > [audio-track-controller]: loading audio-track playlist for id: 0
base-stream-controller.ts:1381 [log] > [audio-stream-controller]: WAITING_TRACK->STOPPED
base-stream-controller.ts:1381 [log] > [audio-stream-controller]: STOPPED->WAITING_TRACK
base-stream-controller.ts:1381 [log] > [subtitle-stream-controller]: STOPPED->IDLE
audio-track-controller.ts:87 [log] > [audio-track-controller]: audioTrack 0 loaded [0-57]
audio-stream-controller.ts:425 [log] > [audio-stream-controller]: Track 0 loaded [0,57],duration:287.9269999999999
base-stream-controller.ts:1381 [log] > [audio-stream-controller]: WAITING_TRACK->IDLE
base-stream-controller.ts:588 [log] > [audio-stream-controller]: Loading fragment initSegment cc: 0 track: 0, target: 0
base-stream-controller.ts:1381 [log] > [audio-stream-controller]: IDLE->FRAG_LOADING
stream-controller.ts:603 [log] > [stream-controller]: Level 5 loaded [0,57], cc [0, 0] duration:287.933
buffer-controller.ts:635 [log] > [buffer-controller]: Updating Media Source duration to 287.933
base-stream-controller.ts:588 [log] > [stream-controller]: Loading fragment initSegment cc: 0 level: 5, target: 0
base-stream-controller.ts:1381 [log] > [stream-controller]: IDLE->FRAG_LOADING
base-stream-controller.ts:1381 [log] > [audio-stream-controller]: FRAG_LOADING->IDLE
base-stream-controller.ts:499 [log] > [audio-stream-controller]: Buffered audio sn: initSegment of track 0 
base-stream-controller.ts:588 [log] > [audio-stream-controller]: Loading fragment 0 cc: 0 of [0-57] track: 0, target: 0
base-stream-controller.ts:1381 [log] > [audio-stream-controller]: IDLE->FRAG_LOADING
base-stream-controller.ts:1381 [log] > [stream-controller]: FRAG_LOADING->IDLE
base-stream-controller.ts:499 [log] > [stream-controller]: Buffered main sn: initSegment of level 5 
base-stream-controller.ts:588 [log] > [stream-controller]: Loading fragment 0 cc: 0 of [0-57] level: 5, target: 0
base-stream-controller.ts:1381 [log] > [stream-controller]: IDLE->FRAG_LOADING
transmuxer-interface.ts:67 [log] > demuxing in webworker
audio-stream-controller.ts:532 [log] > Unknown video PTS for cc 0, waiting for video PTS before demuxing audio frag 0 of [0 ,57],track 0
base-stream-controller.ts:1381 [log] > [audio-stream-controller]: FRAG_LOADING->WAITING_INIT_PTS
base-stream-controller.ts:364 [log] > [audio-stream-controller]: Loaded fragment 0 of level 0
blob:null/79335444-c6bb-46e8-b466-837ce59305aa:603 [log] >
transmuxer-interface.ts:67 [log] > demuxing in webworker
transmuxer-interface.ts:187 [log] > [transmuxer-interface, main]: Starting new transmux session for sn: 0 p: -1 level: 5 id: 1
        discontinuity: true
        trackSwitch: true
        contiguous: false
        accurateTimeOffset: true
        timeOffset: 0
        initSegmentChange: true
base-stream-controller.ts:364 [log] > [stream-controller]: Loaded fragment 0 of level 5
blob:null/8c242804-138b-48eb-93fd-047f8667414f:603 [log] >
blob:null/8c242804-138b-48eb-93fd-047f8667414f:938 [log] > [transmuxer.ts]: Flushed fragment 0 of level 5
base-stream-controller.ts:1381 [log] > [stream-controller]: FRAG_LOADING->PARSING
stream-controller.ts:1226 [log] > [stream-controller]: Init video buffer, container:video/mp4, codecs[level/parsed]=[avc1.64001f/avc1.64001f]
audio-stream-controller.ts:113 [log] > [audio-stream-controller]: InitPTS for cc: 0 found from main: 0
base-stream-controller.ts:1381 [log] > [audio-stream-controller]: WAITING_INIT_PTS->FRAG_LOADING
transmuxer-interface.ts:187 [log] > [transmuxer-interface, audio]: Starting new transmux session for sn: 0 p: -1 level: 0 id: 1
        discontinuity: true
        trackSwitch: true
        contiguous: false
        accurateTimeOffset: false
        timeOffset: 0
        initSegmentChange: true
base-stream-controller.ts:1381 [log] > [stream-controller]: PARSING->PARSED
blob:null/79335444-c6bb-46e8-b466-837ce59305aa:938 [log] > [transmuxer.ts]: Flushed fragment 0 of level 0
base-stream-controller.ts:1381 [log] > [audio-stream-controller]: FRAG_LOADING->PARSING
audio-stream-controller.ts:812 [log] > [audio-stream-controller]: Switching audio track : flushing all audio
audio-stream-controller.ts:760 [log] > [audio-stream-controller]: Init audio buffer, container:audio/mp4, codecs[parsed]=[mp4a.40.2]
buffer-controller.ts:704 [log] > [buffer-controller]: creating sourceBuffer(video/mp4;codecs=avc1.64001f)
buffer-controller.ts:704 [log] > [buffer-controller]: creating sourceBuffer(audio/mp4;codecs=mp4a.40.2)
stream-controller.ts:809 [log] > [stream-controller]: Alternate track found, use video.buffered to schedule main fragment loading
buffer-controller.ts:816 [log] > [buffer-controller]: Removing [0,287.933] from the audio SourceBuffer
base-stream-controller.ts:1381 [log] > [audio-stream-controller]: PARSING->PARSED
base-stream-controller.ts:499 [log] > [stream-controller]: Buffered main sn: 0 of level 5 [0.000,5.000]
base-stream-controller.ts:1381 [log] > [stream-controller]: PARSED->IDLE
level-controller.ts:251 [log] > [level-controller]: switching to level 7 from 5
level-controller.ts:524 [log] > [level-controller]: Attempt loading level index 7 with URL-id 0 https://cdn.muse.ai/w/eefda2e5553e95a62784a066b8c31dd5c5d6c3555cce3b38c5c4728604ac96ed/videos/hls-video-3.m3u8
base-stream-controller.ts:1381 [log] > [stream-controller]: IDLE->WAITING_LEVEL
base-stream-controller.ts:499 [log] > [audio-stream-controller]: Buffered audio sn: 0 of track 0 [0.000,5.020]
base-stream-controller.ts:1381 [log] > [audio-stream-controller]: PARSED->IDLE
base-stream-controller.ts:588 [log] > [audio-stream-controller]: Loading fragment 1 cc: 0 of [0-57] track: 0, target: 5.035
base-stream-controller.ts:1381 [log] > [audio-stream-controller]: IDLE->FRAG_LOADING
stream-controller.ts:603 [log] > [stream-controller]: Level 7 loaded [0,57], cc [0, 0] duration:287.933
base-stream-controller.ts:1381 [log] > [stream-controller]: WAITING_LEVEL->IDLE
base-stream-controller.ts:588 [log] > [stream-controller]: Loading fragment initSegment cc: 0 level: 7, target: 0
base-stream-controller.ts:1381 [log] > [stream-controller]: IDLE->FRAG_LOADING
base-stream-controller.ts:364 [log] > [audio-stream-controller]: Loaded fragment 1 of level 0
blob:null/79335444-c6bb-46e8-b466-837ce59305aa:938 [log] > [transmuxer.ts]: Flushed fragment 1 of level 0
base-stream-controller.ts:1381 [log] > [audio-stream-controller]: FRAG_LOADING->PARSING
base-stream-controller.ts:1381 [log] > [audio-stream-controller]: PARSING->PARSED
base-stream-controller.ts:499 [log] > [audio-stream-controller]: Buffered audio sn: 1 of track 0 [0.000,10.012]
base-stream-controller.ts:1381 [log] > [audio-stream-controller]: PARSED->IDLE
base-stream-controller.ts:588 [log] > [audio-stream-controller]: Loading fragment 2 cc: 0 of [0-57] track: 0, target: 10.027
base-stream-controller.ts:1381 [log] > [audio-stream-controller]: IDLE->FRAG_LOADING
base-stream-controller.ts:1381 [log] > [stream-controller]: FRAG_LOADING->IDLE
base-stream-controller.ts:499 [log] > [stream-controller]: Buffered main sn: initSegment of level 7 [0.000,5.000]
base-stream-controller.ts:588 [log] > [stream-controller]: Loading fragment 1 cc: 0 of [0-57] level: 7, target: 5
base-stream-controller.ts:1381 [log] > [stream-controller]: IDLE->FRAG_LOADING
base-stream-controller.ts:364 [log] > [audio-stream-controller]: Loaded fragment 2 of level 0
blob:null/79335444-c6bb-46e8-b466-837ce59305aa:938 [log] > [transmuxer.ts]: Flushed fragment 2 of level 0
base-stream-controller.ts:1381 [log] > [audio-stream-controller]: FRAG_LOADING->PARSING
base-stream-controller.ts:1381 [log] > [audio-stream-controller]: PARSING->PARSED
base-stream-controller.ts:499 [log] > [audio-stream-controller]: Buffered audio sn: 2 of track 0 [0.000,15.004]
base-stream-controller.ts:1381 [log] > [audio-stream-controller]: PARSED->IDLE
base-stream-controller.ts:588 [log] > [audio-stream-controller]: Loading fragment 3 cc: 0 of [0-57] track: 0, target: 15.019
base-stream-controller.ts:1381 [log] > [audio-stream-controller]: IDLE->FRAG_LOADING
base-stream-controller.ts:364 [log] > [audio-stream-controller]: Loaded fragment 3 of level 0
blob:null/79335444-c6bb-46e8-b466-837ce59305aa:938 [log] > [transmuxer.ts]: Flushed fragment 3 of level 0
base-stream-controller.ts:1381 [log] > [audio-stream-controller]: FRAG_LOADING->PARSING
base-stream-controller.ts:1381 [log] > [audio-stream-controller]: PARSING->PARSED
base-stream-controller.ts:499 [log] > [audio-stream-controller]: Buffered audio sn: 3 of track 0 [0.000,20.018]
base-stream-controller.ts:1381 [log] > [audio-stream-controller]: PARSED->IDLE
base-stream-controller.ts:588 [log] > [audio-stream-controller]: Loading fragment 4 cc: 0 of [0-57] track: 0, target: 20.032
base-stream-controller.ts:1381 [log] > [audio-stream-controller]: IDLE->FRAG_LOADING
base-stream-controller.ts:364 [log] > [audio-stream-controller]: Loaded fragment 4 of level 0
blob:null/79335444-c6bb-46e8-b466-837ce59305aa:938 [log] > [transmuxer.ts]: Flushed fragment 4 of level 0
base-stream-controller.ts:1381 [log] > [audio-stream-controller]: FRAG_LOADING->PARSING
base-stream-controller.ts:1381 [log] > [audio-stream-controller]: PARSING->PARSED
base-stream-controller.ts:499 [log] > [audio-stream-controller]: Buffered audio sn: 4 of track 0 [0.000,25.010]
base-stream-controller.ts:1381 [log] > [audio-stream-controller]: PARSED->IDLE
base-stream-controller.ts:588 [log] > [audio-stream-controller]: Loading fragment 5 cc: 0 of [0-57] track: 0, target: 25.024
base-stream-controller.ts:1381 [log] > [audio-stream-controller]: IDLE->FRAG_LOADING
base-stream-controller.ts:364 [log] > [audio-stream-controller]: Loaded fragment 5 of level 0
blob:null/79335444-c6bb-46e8-b466-837ce59305aa:938 [log] > [transmuxer.ts]: Flushed fragment 5 of level 0
base-stream-controller.ts:1381 [log] > [audio-stream-controller]: FRAG_LOADING->PARSING
base-stream-controller.ts:1381 [log] > [audio-stream-controller]: PARSING->PARSED
base-stream-controller.ts:499 [log] > [audio-stream-controller]: Buffered audio sn: 5 of track 0 [0.000,30.002]
base-stream-controller.ts:1381 [log] > [audio-stream-controller]: PARSED->IDLE
base-stream-controller.ts:588 [log] > [audio-stream-controller]: Loading fragment 6 cc: 0 of [0-57] track: 0, target: 30.016
base-stream-controller.ts:1381 [log] > [audio-stream-controller]: IDLE->FRAG_LOADING
transmuxer-interface.ts:187 [log] > [transmuxer-interface, main]: Starting new transmux session for sn: 1 p: -1 level: 7 id: 1
        discontinuity: false
        trackSwitch: true
        contiguous: false
        accurateTimeOffset: true
        timeOffset: 5
        initSegmentChange: true
base-stream-controller.ts:364 [log] > [stream-controller]: Loaded fragment 1 of level 7
blob:null/8c242804-138b-48eb-93fd-047f8667414f:938 [log] > [transmuxer.ts]: Flushed fragment 1 of level 7
base-stream-controller.ts:364 [log] > [audio-stream-controller]: Loaded fragment 6 of level 0
blob:null/79335444-c6bb-46e8-b466-837ce59305aa:938 [log] > [transmuxer.ts]: Flushed fragment 6 of level 0
base-stream-controller.ts:1381 [log] > [stream-controller]: FRAG_LOADING->PARSING
stream-controller.ts:1226 [log] > [stream-controller]: Init video buffer, container:video/mp4, codecs[level/parsed]=[avc1.640028/avc1.640028]
base-stream-controller.ts:1381 [log] > [stream-controller]: PARSING->PARSED
base-stream-controller.ts:1381 [log] > [audio-stream-controller]: FRAG_LOADING->PARSING
base-stream-controller.ts:1381 [log] > [audio-stream-controller]: PARSING->PARSED
base-stream-controller.ts:499 [log] > [audio-stream-controller]: Buffered audio sn: 6 of track 0 [0.000,35.015]
base-stream-controller.ts:1381 [log] > [audio-stream-controller]: PARSED->IDLE
base-stream-controller.ts:499 [log] > [stream-controller]: Buffered main sn: 1 of level 7 [0.000,10.000]
base-stream-controller.ts:1381 [log] > [stream-controller]: PARSED->IDLE
level-controller.ts:251 [log] > [level-controller]: switching to level 9 from 7
level-controller.ts:524 [log] > [level-controller]: Attempt loading level index 9 with URL-id 0 https://cdn.muse.ai/w/eefda2e5553e95a62784a066b8c31dd5c5d6c3555cce3b38c5c4728604ac96ed/videos/hls-video-4.m3u8
base-stream-controller.ts:1381 [log] > [stream-controller]: IDLE->WAITING_LEVEL
stream-controller.ts:603 [log] > [stream-controller]: Level 9 loaded [0,57], cc [0, 0] duration:287.933
base-stream-controller.ts:1381 [log] > [stream-controller]: WAITING_LEVEL->IDLE
base-stream-controller.ts:588 [log] > [stream-controller]: Loading fragment initSegment cc: 0 level: 9, target: 0
base-stream-controller.ts:1381 [log] > [stream-controller]: IDLE->FRAG_LOADING
base-stream-controller.ts:1381 [log] > [stream-controller]: FRAG_LOADING->IDLE
base-stream-controller.ts:499 [log] > [stream-controller]: Buffered main sn: initSegment of level 9 [0.000,10.000]
base-stream-controller.ts:588 [log] > [stream-controller]: Loading fragment 2 cc: 0 of [0-57] level: 9, target: 10
base-stream-controller.ts:1381 [log] > [stream-controller]: IDLE->FRAG_LOADING
hls.ts:310 [log] > attachMedia
buffer-controller.ts:756 [log] > [buffer-controller]: Media source closed
buffer-controller.ts:742 [log] > [buffer-controller]: Media source opened
buffer-controller.ts:635 [log] > [buffer-controller]: Updating Media Source duration to 287.933
hls.ts:371 [log] > stopLoad
base-stream-controller.ts:1381 [log] > [stream-controller]: FRAG_LOADING->STOPPED
base-stream-controller.ts:1381 [log] > [audio-stream-controller]: IDLE->STOPPED
base-stream-controller.ts:1381 [log] > [subtitle-stream-controller]: IDLE->STOPPED
hls.ts:339 [log] > loadSource:https://cdn.muse.ai/w/eefda2e5553e95a62784a066b8c31dd5c5d6c3555cce3b38c5c4728604ac96ed/videos/hls.m3u8
stream-controller.ts:539 [log] > [stream-controller]: Trigger BUFFER_RESET
buffer-controller.ts:226 [warn] > [buffer-controller]: Failed to reset the video buffer DOMException: Failed to execute 'removeSourceBuffer' on 'MediaSource': The SourceBuffer provided is not contained in this MediaSource.
    at https://cdnjs.cloudflare.com/ajax/libs/hls.js/1.1.5/hls.js:4379:32
    at Array.forEach (<anonymous>)
    at BufferController.onBufferReset (https://cdnjs.cloudflare.com/ajax/libs/hls.js/1.1.5/hls.js:4371:33)
    at EventEmitter.emit (https://cdnjs.cloudflare.com/ajax/libs/hls.js/1.1.5/hls.js:310:33)
    at Hls.emit (https://cdnjs.cloudflare.com/ajax/libs/hls.js/1.1.5/hls.js:17266:26)
    at Hls.trigger (https://cdnjs.cloudflare.com/ajax/libs/hls.js/1.1.5/hls.js:17271:19)
    at StreamController.onManifestLoading (https://cdnjs.cloudflare.com/ajax/libs/hls.js/1.1.5/hls.js:9790:14)
    at EventEmitter.emit (https://cdnjs.cloudflare.com/ajax/libs/hls.js/1.1.5/hls.js:310:33)
    at Hls.emit (https://cdnjs.cloudflare.com/ajax/libs/hls.js/1.1.5/hls.js:17266:26)
    at Hls.trigger (https://cdnjs.cloudflare.com/ajax/libs/hls.js/1.1.5/hls.js:17271:19)
(anonymous) @ buffer-controller.ts:226
onBufferReset @ buffer-controller.ts:213
emit @ index.js:203
emit @ hls.ts:250
trigger @ hls.ts:258
onManifestLoading @ stream-controller.ts:540
emit @ index.js:203
emit @ hls.ts:250
trigger @ hls.ts:258
loadSource @ hls.ts:350
onAttached @ hls-issue.html:16
emit @ index.js:203
emit @ hls.ts:250
trigger @ hls.ts:258
BufferController._onMediaSourceOpen @ buffer-controller.ts:745
buffer-controller.ts:226 [warn] > [buffer-controller]: Failed to reset the audio buffer DOMException: Failed to execute 'removeSourceBuffer' on 'MediaSource': The SourceBuffer provided is not contained in this MediaSource.
    at https://cdnjs.cloudflare.com/ajax/libs/hls.js/1.1.5/hls.js:4379:32
    at Array.forEach (<anonymous>)
    at BufferController.onBufferReset (https://cdnjs.cloudflare.com/ajax/libs/hls.js/1.1.5/hls.js:4371:33)
    at EventEmitter.emit (https://cdnjs.cloudflare.com/ajax/libs/hls.js/1.1.5/hls.js:310:33)
    at Hls.emit (https://cdnjs.cloudflare.com/ajax/libs/hls.js/1.1.5/hls.js:17266:26)
    at Hls.trigger (https://cdnjs.cloudflare.com/ajax/libs/hls.js/1.1.5/hls.js:17271:19)
    at StreamController.onManifestLoading (https://cdnjs.cloudflare.com/ajax/libs/hls.js/1.1.5/hls.js:9790:14)
    at EventEmitter.emit (https://cdnjs.cloudflare.com/ajax/libs/hls.js/1.1.5/hls.js:310:33)
    at Hls.emit (https://cdnjs.cloudflare.com/ajax/libs/hls.js/1.1.5/hls.js:17266:26)
    at Hls.trigger (https://cdnjs.cloudflare.com/ajax/libs/hls.js/1.1.5/hls.js:17271:19)
(anonymous) @ buffer-controller.ts:226
onBufferReset @ buffer-controller.ts:213
emit @ index.js:203
emit @ hls.ts:250
trigger @ hls.ts:258
onManifestLoading @ stream-controller.ts:540
emit @ index.js:203
emit @ hls.ts:250
trigger @ hls.ts:258
loadSource @ hls.ts:350
onAttached @ hls-issue.html:16
emit @ index.js:203
emit @ hls.ts:250
trigger @ hls.ts:258
BufferController._onMediaSourceOpen @ buffer-controller.ts:745
level-controller.ts:172 [log] > [level-controller]: manifest loaded, 10 level(s) found, first bitrate: 468219
buffer-controller.ts:136 [log] > 2 bufferCodec event(s) expected
hls.ts:361 [log] > startLoad(-1)
level-controller.ts:524 [log] > [level-controller]: Attempt loading level index 9 with URL-id 0 https://cdn.muse.ai/w/eefda2e5553e95a62784a066b8c31dd5c5d6c3555cce3b38c5c4728604ac96ed/videos/hls-video-4.m3u8
audio-track-controller.ts:134 [log] > [audio-track-controller]: Updating audio tracks, 1 track(s) found in "audio-1" group-id
audio-track-controller.ts:185 [log] > [audio-track-controller]: Now switching to audio-track index 0
base-stream-controller.ts:1381 [log] > [audio-stream-controller]: STOPPED->IDLE
base-stream-controller.ts:1381 [log] > [audio-stream-controller]: IDLE->WAITING_TRACK
level-controller.ts:251 [log] > [level-controller]: switching to level 9 from 9
level-controller.ts:524 [log] > [level-controller]: Attempt loading level index 9 with URL-id 0 https://cdn.muse.ai/w/eefda2e5553e95a62784a066b8c31dd5c5d6c3555cce3b38c5c4728604ac96ed/videos/hls-video-4.m3u8
base-stream-controller.ts:1381 [log] > [stream-controller]: STOPPED->IDLE
level-controller.ts:251 [log] > [level-controller]: switching to level 9 from 9
level-controller.ts:524 [log] > [level-controller]: Attempt loading level index 9 with URL-id 0 https://cdn.muse.ai/w/eefda2e5553e95a62784a066b8c31dd5c5d6c3555cce3b38c5c4728604ac96ed/videos/hls-video-4.m3u8
base-stream-controller.ts:1381 [log] > [stream-controller]: IDLE->WAITING_LEVEL
audio-track-controller.ts:258 [log] > [audio-track-controller]: loading audio-track playlist for id: 0
base-stream-controller.ts:1381 [log] > [audio-stream-controller]: WAITING_TRACK->STOPPED
base-stream-controller.ts:1381 [log] > [audio-stream-controller]: STOPPED->WAITING_TRACK
base-stream-controller.ts:1381 [log] > [subtitle-stream-controller]: STOPPED->IDLE
stream-controller.ts:603 [log] > [stream-controller]: Level 9 loaded [0,57], cc [0, 0] duration:287.933
base-stream-controller.ts:1381 [log] > [stream-controller]: WAITING_LEVEL->IDLE
level-controller.ts:251 [log] > [level-controller]: switching to level 8 from 9
audio-track-controller.ts:134 [log] > [audio-track-controller]: Updating audio tracks, 1 track(s) found in "audio-0" group-id
audio-track-controller.ts:185 [log] > [audio-track-controller]: Now switching to audio-track index 0
base-stream-controller.ts:1381 [log] > [audio-stream-controller]: WAITING_TRACK->IDLE
base-stream-controller.ts:1381 [log] > [audio-stream-controller]: IDLE->WAITING_TRACK
audio-track-controller.ts:258 [log] > [audio-track-controller]: loading audio-track playlist for id: 0
playlist-loader.ts:218 [log] > [playlist-loader]: aborting previous loader for type: audioTrack
level-controller.ts:524 [log] > [level-controller]: Attempt loading level index 8 with URL-id 0 https://cdn.muse.ai/w/eefda2e5553e95a62784a066b8c31dd5c5d6c3555cce3b38c5c4728604ac96ed/videos/hls-video-4.m3u8
base-stream-controller.ts:1381 [log] > [stream-controller]: IDLE->WAITING_LEVEL
audio-track-controller.ts:87 [log] > [audio-track-controller]: audioTrack 0 loaded [0-57]
audio-stream-controller.ts:425 [log] > [audio-stream-controller]: Track 0 loaded [0,57],duration:287.9269999999999
base-stream-controller.ts:1381 [log] > [audio-stream-controller]: WAITING_TRACK->IDLE
base-stream-controller.ts:588 [log] > [audio-stream-controller]: Loading fragment initSegment cc: 0 track: 0, target: 0
base-stream-controller.ts:1381 [log] > [audio-stream-controller]: IDLE->FRAG_LOADING
stream-controller.ts:603 [log] > [stream-controller]: Level 8 loaded [0,57], cc [0, 0] duration:287.933
base-stream-controller.ts:1381 [log] > [stream-controller]: WAITING_LEVEL->IDLE
level-controller.ts:251 [log] > [level-controller]: switching to level 7 from 8
audio-track-controller.ts:134 [log] > [audio-track-controller]: Updating audio tracks, 1 track(s) found in "audio-1" group-id
audio-track-controller.ts:185 [log] > [audio-track-controller]: Now switching to audio-track index 0
base-stream-controller.ts:1381 [log] > [audio-stream-controller]: FRAG_LOADING->IDLE
base-stream-controller.ts:1381 [log] > [audio-stream-controller]: IDLE->WAITING_TRACK
audio-track-controller.ts:258 [log] > [audio-track-controller]: loading audio-track playlist for id: 0
level-controller.ts:524 [log] > [level-controller]: Attempt loading level index 7 with URL-id 0 https://cdn.muse.ai/w/eefda2e5553e95a62784a066b8c31dd5c5d6c3555cce3b38c5c4728604ac96ed/videos/hls-video-3.m3u8
base-stream-controller.ts:1381 [log] > [stream-controller]: IDLE->WAITING_LEVEL
base-stream-controller.ts:481 [warn] > [audio-stream-controller]: Error: init load aborted
    at base-stream-controller.ts:405:17
(anonymous) @ base-stream-controller.ts:481
Promise.catch (async)
_loadInitSegment @ base-stream-controller.ts:402
loadFragment @ audio-stream-controller.ts:796
doTickIdle @ audio-stream-controller.ts:345
doTick @ audio-stream-controller.ts:154
tick @ task-loop.ts:110
onAudioTrackLoaded @ audio-stream-controller.ts:468
emit @ index.js:203
emit @ hls.ts:250
trigger @ hls.ts:258
handlePlaylistLoaded @ playlist-loader.ts:707
handleTrackOrLevelPlaylist @ playlist-loader.ts:539
loadsuccess @ playlist-loader.ts:339
readystatechange @ xhr-loader.ts:197
XMLHttpRequest.send (async)
loadInternal @ xhr-loader.ts:134
load @ xhr-loader.ts:72
load @ playlist-loader.ts:303
onAudioTrackLoading @ playlist-loader.ts:177
emit @ index.js:182
emit @ hls.ts:250
trigger @ hls.ts:258
loadPlaylist @ audio-track-controller.ts:260
setAudioTrack @ audio-track-controller.ts:203
selectInitialTrack @ audio-track-controller.ts:217
switchLevel @ audio-track-controller.ts:139
onLevelSwitching @ audio-track-controller.ts:106
emit @ index.js:203
emit @ hls.ts:250
trigger @ hls.ts:258
set @ level-controller.ts:262
set @ level-controller.ts:556
set @ hls.ts:486
doTickIdle @ stream-controller.ts:232
doTick @ stream-controller.ts:166
tick @ task-loop.ts:110
onLevelLoaded @ stream-controller.ts:655
emit @ index.js:203
emit @ hls.ts:250
trigger @ hls.ts:258
handlePlaylistLoaded @ playlist-loader.ts:697
handleTrackOrLevelPlaylist @ playlist-loader.ts:539
loadsuccess @ playlist-loader.ts:339
readystatechange @ xhr-loader.ts:197
XMLHttpRequest.send (async)
loadInternal @ xhr-loader.ts:134
load @ xhr-loader.ts:72
load @ playlist-loader.ts:303
onLevelLoading @ playlist-loader.ts:161
emit @ index.js:203
emit @ hls.ts:250
trigger @ hls.ts:258
loadPlaylist @ level-controller.ts:538
startLoad @ base-playlist-controller.ts:51
startLoad @ level-controller.ts:76
(anonymous) @ hls.ts:363
startLoad @ hls.ts:362
onManifestLoaded @ level-controller.ts:196
emit @ index.js:203
emit @ hls.ts:250
trigger @ hls.ts:258
handleMasterPlaylist @ playlist-loader.ts:444
loadsuccess @ playlist-loader.ts:341
readystatechange @ xhr-loader.ts:197
XMLHttpRequest.send (async)
loadInternal @ xhr-loader.ts:134
load @ xhr-loader.ts:72
load @ playlist-loader.ts:303
onManifestLoading @ playlist-loader.ts:148
emit @ index.js:203
emit @ hls.ts:250
trigger @ hls.ts:258
loadSource @ hls.ts:350
onAttached @ hls-issue.html:16
emit @ index.js:203
emit @ hls.ts:250
trigger @ hls.ts:258
BufferController._onMediaSourceOpen @ buffer-controller.ts:745
base-stream-controller.ts:1381 [log] > [audio-stream-controller]: WAITING_TRACK->IDLE
base-stream-controller.ts:1381 [log] > [audio-stream-controller]: IDLE->WAITING_TRACK
stream-controller.ts:603 [log] > [stream-controller]: Level 7 loaded [0,57], cc [0, 0] duration:287.933
base-stream-controller.ts:1381 [log] > [stream-controller]: WAITING_LEVEL->IDLE
level-controller.ts:251 [log] > [level-controller]: switching to level 6 from 7
audio-track-controller.ts:134 [log] > [audio-track-controller]: Updating audio tracks, 1 track(s) found in "audio-0" group-id
audio-track-controller.ts:185 [log] > [audio-track-controller]: Now switching to audio-track index 0
base-stream-controller.ts:1381 [log] > [audio-stream-controller]: WAITING_TRACK->IDLE
base-stream-controller.ts:588 [log] > [audio-stream-controller]: Loading fragment initSegment cc: 0 track: 0, target: 0
base-stream-controller.ts:1381 [log] > [audio-stream-controller]: IDLE->FRAG_LOADING
level-controller.ts:524 [log] > [level-controller]: Attempt loading level index 6 with URL-id 0 https://cdn.muse.ai/w/eefda2e5553e95a62784a066b8c31dd5c5d6c3555cce3b38c5c4728604ac96ed/videos/hls-video-3.m3u8
base-stream-controller.ts:1381 [log] > [stream-controller]: IDLE->WAITING_LEVEL
audio-track-controller.ts:87 [log] > [audio-track-controller]: audioTrack 0 loaded [0-57]
audio-stream-controller.ts:425 [log] > [audio-stream-controller]: Track 0 loaded [0,57],duration:287.9269999999999
base-stream-controller.ts:1381 [log] > [audio-stream-controller]: FRAG_LOADING->IDLE
base-stream-controller.ts:499 [log] > [audio-stream-controller]: Buffered audio sn: initSegment of track 0 
base-stream-controller.ts:588 [log] > [audio-stream-controller]: Loading fragment initSegment cc: 0 track: 0, target: 0
base-stream-controller.ts:1381 [log] > [audio-stream-controller]: IDLE->FRAG_LOADING
stream-controller.ts:603 [log] > [stream-controller]: Level 6 loaded [0,57], cc [0, 0] duration:287.933
base-stream-controller.ts:1381 [log] > [stream-controller]: WAITING_LEVEL->IDLE
level-controller.ts:251 [log] > [level-controller]: switching to level 5 from 6
audio-track-controller.ts:134 [log] > [audio-track-controller]: Updating audio tracks, 1 track(s) found in "audio-1" group-id
audio-track-controller.ts:185 [log] > [audio-track-controller]: Now switching to audio-track index 0
base-stream-controller.ts:1381 [log] > [audio-stream-controller]: FRAG_LOADING->IDLE
base-stream-controller.ts:1381 [log] > [audio-stream-controller]: IDLE->WAITING_TRACK
audio-track-controller.ts:258 [log] > [audio-track-controller]: loading audio-track playlist for id: 0
level-controller.ts:524 [log] > [level-controller]: Attempt loading level index 5 with URL-id 0 https://cdn.muse.ai/w/eefda2e5553e95a62784a066b8c31dd5c5d6c3555cce3b38c5c4728604ac96ed/videos/hls-video-2.m3u8
base-stream-controller.ts:1381 [log] > [stream-controller]: IDLE->WAITING_LEVEL
base-stream-controller.ts:481 [warn] > [audio-stream-controller]: Error: init load aborted
    at base-stream-controller.ts:405:17
(anonymous) @ base-stream-controller.ts:481
Promise.catch (async)
_loadInitSegment @ base-stream-controller.ts:402
loadFragment @ audio-stream-controller.ts:796
doTickIdle @ audio-stream-controller.ts:345
doTick @ audio-stream-controller.ts:154
tick @ task-loop.ts:110
fragBufferedComplete @ base-stream-controller.ts:507
onFragBuffered @ audio-stream-controller.ts:595
emit @ index.js:203
emit @ hls.ts:250
trigger @ hls.ts:258
(anonymous) @ base-stream-controller.ts:471
Promise.then (async)
_loadInitSegment @ base-stream-controller.ts:450
loadFragment @ audio-stream-controller.ts:796
doTickIdle @ audio-stream-controller.ts:345
doTick @ audio-stream-controller.ts:154
tick @ task-loop.ts:110
onAudioTrackSwitching @ audio-stream-controller.ts:404
emit @ index.js:203
emit @ hls.ts:250
trigger @ hls.ts:258
setAudioTrack @ audio-track-controller.ts:191
selectInitialTrack @ audio-track-controller.ts:217
switchLevel @ audio-track-controller.ts:139
onLevelSwitching @ audio-track-controller.ts:106
emit @ index.js:203
emit @ hls.ts:250
trigger @ hls.ts:258
set @ level-controller.ts:262
set @ level-controller.ts:556
set @ hls.ts:486
doTickIdle @ stream-controller.ts:232
doTick @ stream-controller.ts:166
tick @ task-loop.ts:110
onLevelLoaded @ stream-controller.ts:655
emit @ index.js:203
emit @ hls.ts:250
trigger @ hls.ts:258
handlePlaylistLoaded @ playlist-loader.ts:697
handleTrackOrLevelPlaylist @ playlist-loader.ts:539
loadsuccess @ playlist-loader.ts:339
readystatechange @ xhr-loader.ts:197
XMLHttpRequest.send (async)
loadInternal @ xhr-loader.ts:134
load @ xhr-loader.ts:72
load @ playlist-loader.ts:303
onLevelLoading @ playlist-loader.ts:161
emit @ index.js:203
emit @ hls.ts:250
trigger @ hls.ts:258
loadPlaylist @ level-controller.ts:538
set @ level-controller.ts:268
set @ level-controller.ts:556
set @ hls.ts:486
doTickIdle @ stream-controller.ts:232
doTick @ stream-controller.ts:166
tick @ task-loop.ts:110
onLevelLoaded @ stream-controller.ts:655
emit @ index.js:203
emit @ hls.ts:250
trigger @ hls.ts:258
handlePlaylistLoaded @ playlist-loader.ts:697
handleTrackOrLevelPlaylist @ playlist-loader.ts:539
loadsuccess @ playlist-loader.ts:339
readystatechange @ xhr-loader.ts:197
XMLHttpRequest.send (async)
loadInternal @ xhr-loader.ts:134
load @ xhr-loader.ts:72
load @ playlist-loader.ts:303
onLevelLoading @ playlist-loader.ts:161
emit @ index.js:203
emit @ hls.ts:250
trigger @ hls.ts:258
loadPlaylist @ level-controller.ts:538
set @ level-controller.ts:268
set @ level-controller.ts:556
set @ hls.ts:486
doTickIdle @ stream-controller.ts:232
doTick @ stream-controller.ts:166
tick @ task-loop.ts:110
onLevelLoaded @ stream-controller.ts:655
emit @ index.js:203
emit @ hls.ts:250
trigger @ hls.ts:258
handlePlaylistLoaded @ playlist-loader.ts:697
handleTrackOrLevelPlaylist @ playlist-loader.ts:539
loadsuccess @ playlist-loader.ts:339
readystatechange @ xhr-loader.ts:197
XMLHttpRequest.send (async)
loadInternal @ xhr-loader.ts:134
load @ xhr-loader.ts:72
load @ playlist-loader.ts:303
onLevelLoading @ playlist-loader.ts:161
emit @ index.js:203
emit @ hls.ts:250
trigger @ hls.ts:258
loadPlaylist @ level-controller.ts:538
startLoad @ base-playlist-controller.ts:51
startLoad @ level-controller.ts:76
(anonymous) @ hls.ts:363
startLoad @ hls.ts:362
onManifestLoaded @ level-controller.ts:196
emit @ index.js:203
emit @ hls.ts:250
trigger @ hls.ts:258
handleMasterPlaylist @ playlist-loader.ts:444
loadsuccess @ playlist-loader.ts:341
readystatechange @ xhr-loader.ts:197
XMLHttpRequest.send (async)
loadInternal @ xhr-loader.ts:134
load @ xhr-loader.ts:72
load @ playlist-loader.ts:303
onManifestLoading @ playlist-loader.ts:148
emit @ index.js:203
emit @ hls.ts:250
trigger @ hls.ts:258
loadSource @ hls.ts:350
onAttached @ hls-issue.html:16
emit @ index.js:203
emit @ hls.ts:250
trigger @ hls.ts:258
BufferController._onMediaSourceOpen @ buffer-controller.ts:745
base-stream-controller.ts:1381 [log] > [audio-stream-controller]: WAITING_TRACK->IDLE
base-stream-controller.ts:1381 [log] > [audio-stream-controller]: IDLE->WAITING_TRACK
stream-controller.ts:603 [log] > [stream-controller]: Level 5 loaded [0,57], cc [0, 0] duration:287.933
base-stream-controller.ts:1381 [log] > [stream-controller]: WAITING_LEVEL->IDLE
level-controller.ts:251 [log] > [level-controller]: switching to level 4 from 5
audio-track-controller.ts:134 [log] > [audio-track-controller]: Updating audio tracks, 1 track(s) found in "audio-0" group-id
audio-track-controller.ts:185 [log] > [audio-track-controller]: Now switching to audio-track index 0
base-stream-controller.ts:1381 [log] > [audio-stream-controller]: WAITING_TRACK->IDLE
base-stream-controller.ts:588 [log] > [audio-stream-controller]: Loading fragment initSegment cc: 0 track: 0, target: 0
base-stream-controller.ts:1381 [log] > [audio-stream-controller]: IDLE->FRAG_LOADING
level-controller.ts:524 [log] > [level-controller]: Attempt loading level index 4 with URL-id 0 https://cdn.muse.ai/w/eefda2e5553e95a62784a066b8c31dd5c5d6c3555cce3b38c5c4728604ac96ed/videos/hls-video-2.m3u8
base-stream-controller.ts:1381 [log] > [stream-controller]: IDLE->WAITING_LEVEL
audio-track-controller.ts:87 [log] > [audio-track-controller]: audioTrack 0 loaded [0-57]
audio-stream-controller.ts:425 [log] > [audio-stream-controller]: Track 0 loaded [0,57],duration:287.9269999999999
stream-controller.ts:603 [log] > [stream-controller]: Level 4 loaded [0,57], cc [0, 0] duration:287.933
base-stream-controller.ts:1381 [log] > [stream-controller]: WAITING_LEVEL->IDLE
level-controller.ts:251 [log] > [level-controller]: switching to level 3 from 4
audio-track-controller.ts:134 [log] > [audio-track-controller]: Updating audio tracks, 1 track(s) found in "audio-1" group-id
audio-track-controller.ts:185 [log] > [audio-track-controller]: Now switching to audio-track index 0
base-stream-controller.ts:1381 [log] > [audio-stream-controller]: FRAG_LOADING->IDLE
base-stream-controller.ts:1381 [log] > [audio-stream-controller]: IDLE->WAITING_TRACK
audio-track-controller.ts:258 [log] > [audio-track-controller]: loading audio-track playlist for id: 0
level-controller.ts:524 [log] > [level-controller]: Attempt loading level index 3 with URL-id 0 https://cdn.muse.ai/w/eefda2e5553e95a62784a066b8c31dd5c5d6c3555cce3b38c5c4728604ac96ed/videos/hls-video-1.m3u8
base-stream-controller.ts:1381 [log] > [stream-controller]: IDLE->WAITING_LEVEL
base-stream-controller.ts:481 [warn] > [audio-stream-controller]: Error: init load aborted
    at base-stream-controller.ts:405:17
(anonymous) @ base-stream-controller.ts:481
Promise.catch (async)
_loadInitSegment @ base-stream-controller.ts:402
loadFragment @ audio-stream-controller.ts:796
doTickIdle @ audio-stream-controller.ts:345
doTick @ audio-stream-controller.ts:154
tick @ task-loop.ts:110
onAudioTrackSwitching @ audio-stream-controller.ts:404
emit @ index.js:203
emit @ hls.ts:250
trigger @ hls.ts:258
setAudioTrack @ audio-track-controller.ts:191
selectInitialTrack @ audio-track-controller.ts:217
switchLevel @ audio-track-controller.ts:139
onLevelSwitching @ audio-track-controller.ts:106
emit @ index.js:203
emit @ hls.ts:250
trigger @ hls.ts:258
set @ level-controller.ts:262
set @ level-controller.ts:556
set @ hls.ts:486
doTickIdle @ stream-controller.ts:232
doTick @ stream-controller.ts:166
tick @ task-loop.ts:110
onLevelLoaded @ stream-controller.ts:655
emit @ index.js:203
emit @ hls.ts:250
trigger @ hls.ts:258
handlePlaylistLoaded @ playlist-loader.ts:697
handleTrackOrLevelPlaylist @ playlist-loader.ts:539
loadsuccess @ playlist-loader.ts:339
readystatechange @ xhr-loader.ts:197
XMLHttpRequest.send (async)
loadInternal @ xhr-loader.ts:134
load @ xhr-loader.ts:72
load @ playlist-loader.ts:303
onLevelLoading @ playlist-loader.ts:161
emit @ index.js:203
emit @ hls.ts:250
trigger @ hls.ts:258
loadPlaylist @ level-controller.ts:538
set @ level-controller.ts:268
set @ level-controller.ts:556
set @ hls.ts:486
doTickIdle @ stream-controller.ts:232
doTick @ stream-controller.ts:166
tick @ task-loop.ts:110
onLevelLoaded @ stream-controller.ts:655
emit @ index.js:203
emit @ hls.ts:250
trigger @ hls.ts:258
handlePlaylistLoaded @ playlist-loader.ts:697
handleTrackOrLevelPlaylist @ playlist-loader.ts:539
loadsuccess @ playlist-loader.ts:339
readystatechange @ xhr-loader.ts:197
XMLHttpRequest.send (async)
loadInternal @ xhr-loader.ts:134
load @ xhr-loader.ts:72
load @ playlist-loader.ts:303
onLevelLoading @ playlist-loader.ts:161
emit @ index.js:203
emit @ hls.ts:250
trigger @ hls.ts:258
loadPlaylist @ level-controller.ts:538
set @ level-controller.ts:268
set @ level-controller.ts:556
set @ hls.ts:486
doTickIdle @ stream-controller.ts:232
doTick @ stream-controller.ts:166
tick @ task-loop.ts:110
onLevelLoaded @ stream-controller.ts:655
emit @ index.js:203
emit @ hls.ts:250
trigger @ hls.ts:258
handlePlaylistLoaded @ playlist-loader.ts:697
handleTrackOrLevelPlaylist @ playlist-loader.ts:539
loadsuccess @ playlist-loader.ts:339
readystatechange @ xhr-loader.ts:197
XMLHttpRequest.send (async)
loadInternal @ xhr-loader.ts:134
load @ xhr-loader.ts:72
load @ playlist-loader.ts:303
onLevelLoading @ playlist-loader.ts:161
emit @ index.js:203
emit @ hls.ts:250
trigger @ hls.ts:258
loadPlaylist @ level-controller.ts:538
set @ level-controller.ts:268
set @ level-controller.ts:556
set @ hls.ts:486
doTickIdle @ stream-controller.ts:232
doTick @ stream-controller.ts:166
tick @ task-loop.ts:110
onLevelLoaded @ stream-controller.ts:655
emit @ index.js:203
emit @ hls.ts:250
trigger @ hls.ts:258
handlePlaylistLoaded @ playlist-loader.ts:697
handleTrackOrLevelPlaylist @ playlist-loader.ts:539
loadsuccess @ playlist-loader.ts:339
readystatechange @ xhr-loader.ts:197
XMLHttpRequest.send (async)
loadInternal @ xhr-loader.ts:134
load @ xhr-loader.ts:72
load @ playlist-loader.ts:303
onLevelLoading @ playlist-loader.ts:161
emit @ index.js:203
emit @ hls.ts:250
trigger @ hls.ts:258
loadPlaylist @ level-controller.ts:538
set @ level-controller.ts:268
set @ level-controller.ts:556
set @ hls.ts:486
doTickIdle @ stream-controller.ts:232
doTick @ stream-controller.ts:166
tick @ task-loop.ts:110
onLevelLoaded @ stream-controller.ts:655
emit @ index.js:203
emit @ hls.ts:250
trigger @ hls.ts:258
handlePlaylistLoaded @ playlist-loader.ts:697
handleTrackOrLevelPlaylist @ playlist-loader.ts:539
loadsuccess @ playlist-loader.ts:339
readystatechange @ xhr-loader.ts:197
XMLHttpRequest.send (async)
loadInternal @ xhr-loader.ts:134
load @ xhr-loader.ts:72
load @ playlist-loader.ts:303
onLevelLoading @ playlist-loader.ts:161
emit @ index.js:203
emit @ hls.ts:250
trigger @ hls.ts:258
loadPlaylist @ level-controller.ts:538
startLoad @ base-playlist-controller.ts:51
startLoad @ level-controller.ts:76
(anonymous) @ hls.ts:363
startLoad @ hls.ts:362
onManifestLoaded @ level-controller.ts:196
emit @ index.js:203
emit @ hls.ts:250
trigger @ hls.ts:258
handleMasterPlaylist @ playlist-loader.ts:444
loadsuccess @ playlist-loader.ts:341
readystatechange @ xhr-loader.ts:197
XMLHttpRequest.send (async)
loadInternal @ xhr-loader.ts:134
load @ xhr-loader.ts:72
load @ playlist-loader.ts:303
onManifestLoading @ playlist-loader.ts:148
emit @ index.js:203
emit @ hls.ts:250
trigger @ hls.ts:258
loadSource @ hls.ts:350
onAttached @ hls-issue.html:16
emit @ index.js:203
emit @ hls.ts:250
trigger @ hls.ts:258
BufferController._onMediaSourceOpen @ buffer-controller.ts:745

Chrome media internals output

No response

naktinis avatar Mar 29 '22 15:03 naktinis

Sorry for bumping this, but maybe someone has insights into why it is impossible to reuse the HLS instance by detaching and attaching again (or loading a new source for that matter).

It would be useful if detachMedia could stop all processing and reset the player to a clean state.

image

naktinis avatar Jul 08 '22 09:07 naktinis

Hi @naktinis,

The main issue here is with the test page implementation. By calling hls.attachMedia(video) on an hls.js player with the video already attached, you are replacing the source buffer without removing it, and then in the attach callback loading a source which attempts to detach and remove the buffers just replaced. Instead, just call loadSource, or call hls.detachMedia() first to safely remove the source buffers before replacing them.

As for the comment in your bump, I'm not sure if that's related to the same problem with your test page or something else. I did just post a fix for resuming loading of alt-audio after detaching and attaching here #4816.

You only need to attach once, and you don't need to call loadSource in a callback. I would recommend you don't use the attached callback at all.

robwalch avatar Jul 27 '22 20:07 robwalch

Hi @robwalch! Thank you for the response.

You only need to attach once, and you don't need to call loadSource in a callback. I would recommend you don't use the attached callback at all.

So do you mean instead of this:

function reset() {
  onAttached = function() {
    hls.loadSource('https://cdn.muse.ai/w/eefda2e5553e95a62784a066b8c31dd5c5d6c3555cce3b38c5c4728604ac96ed/videos/hls.m3u8');
  }
  hls.once(Hls.Events.MEDIA_ATTACHED, onAttached);
  hls.attachMedia(document.getElementById('video'));
}

I should do something like this (attach once, not use callback)?

hls.attachMedia(document.getElementById('video'));
function reset() {
  hls.loadSource('https://cdn.muse.ai/w/eefda2e5553e95a62784a066b8c31dd5c5d6c3555cce3b38c5c4728604ac96ed/videos/hls.m3u8');
}

However, this doesn't load the video at all. Most likely I misunderstood what you meant – could you maybe show the correct way of setting a new source without reinstantiating Hls?

naktinis avatar Jul 28 '22 09:07 naktinis

You would still need to call reset() in the example above. There are examples in the README and API markdown docs.

robwalch avatar Jul 28 '22 16:07 robwalch

Sorry, I wasn't being clear, that was just an excerpt showing the significant/conceptual part. Here's the full updated demo: https://gistcdn.githack.com/naktinis/3e836f0a2fa088510b4b1ad27fa81a9a/raw/ec237438cb212fc3e32eecc67a67428659787cc6/hls-reload-2.html

I've seen the examples in the README, but I couldn't find any example there that demonstrates loading source twice on the same hls instance.

I'm also attaching the full updated demo code below for reference:

<!doctype html>
<html>
  <head>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/hls.js/1.1.5/hls.js"></script>

    <script>
      let hls;
      window.addEventListener('DOMContentLoaded', () => {
        hls = new Hls({
          debug: true,
          testBandwidth: false,
          abrEwmaDefaultEstimate: 4500000,
          startLevel: -1,
        });

        hls.loadSource('https://cdn.muse.ai/w/eefda2e5553e95a62784a066b8c31dd5c5d6c3555cce3b38c5c4728604ac96ed/videos/hls.m3u8');
        hls.attachMedia(document.getElementById('video'));
      });

      function reset1() {
        hls.loadSource('https://cdn.muse.ai/w/eefda2e5553e95a62784a066b8c31dd5c5d6c3555cce3b38c5c4728604ac96ed/videos/hls.m3u8');
      }

      function reset2() {
        hls.loadSource('https://cdn.muse.ai/w/eefda2e5553e95a62784a066b8c31dd5c5d6c3555cce3b38c5c4728604ac96ed/videos/hls.m3u8');
        hls.detachMedia();
        hls.attachMedia(document.getElementById('video'));
      }
    </script>
  </head>
  <body>
    Instructions:
    <ol>
      <li>Load mutlitple times using the buttons below
      <li>Look for "Error: init load aborted" in logs
      <li>Another possible side effect of reload: ABR intially dropping quality despite having enough bandwidth (then recovering)
    </ol>
    <button onclick="reset1()">Reload video (method 1)</button>
    <button onclick="reset2()">Reload video (method 2)</button>
    <br><br>
    <video id="video" width="640" height="360" autoplay controls muted></video>
  </body>
</html>

naktinis avatar Jul 28 '22 16:07 naktinis

Hi @naktinis,

Thanks for the update. When calling loadSource(), HLS.js will detach and attach if the URL you pass it is different from the last. In this case, since you are attempting to reset and load the exact same URL, it skips this step. The way to do this without error would be, detach, load, and then attach.

There may be a regression with just calling loadSource on the same URL, but there isn't a good reason to do this when you can just seek to 0 to restart playback. In fact in older versions of the player we always recommended that users destroy the player instance and create a new instance when loading another stream.

robwalch avatar Jul 28 '22 19:07 robwalch

For context, one of the reasons loadSource does not detach/attach when the url is the same is to avoid recursive behavior when you use the attached event callback to call loadSource (#3732). So rolling back that change is not an option. Additional resetting could happen in onManifestLoading or some improvements could be made to onBufferReset to deal with this specific scenario, but I don't think they are worth it considering how easy it is to work around, and how well the workarounds available perform.

robwalch avatar Jul 28 '22 21:07 robwalch

@robwalch thanks for taking a look at this. So I tested this by loading a new URL and it still doesn't work as expected. Added link to the demo below.

I tried 3 methods to change the source:

  • just loadSource(newURL), result: quality drops despite having enough bandwidth, also "init load aborted" warnings
  • detachMedia, loadSource, attachMedia, result: the same, i.e. quality drops, and shows warnings
  • create a new instance of Hls, result: works as expected, quality always good

These quality drops, by the way, is something I described in my original description of this issue and I can't seem to find a way to avoid them. For example, I tried stopLoading and detachMedia, but it doesn't seem to help.

So I still haven't found the correct way to properly load (without quality drops and warnings) a new source on an existing Hls instance – which was the main goal of this issue.

Maybe I'm missing some cleanup method (other than stopLoading and detachMedia which I've tried) that resets the instance, clears the buffers etc.? Or maybe the existing methods could be extended to allow for loading a new source of an existing instance as smoothly as with a new instance?

Demo: https://gistcdn.githack.com/naktinis/0585a3f6303b3dd1c37f99476545aa33/raw/8871becc887ff29d33403cbafa91adc21af5ec76/hls-reload-3.html

naktinis avatar Aug 01 '22 09:08 naktinis

Not a Contribution

These quality drops, by the way, is something I described in my original description of this issue

HLS.js does not maintain quality between loading of items. This is not an error and requires a separate feature request to deal with. I am reviewing this issue only from the perspective that loadSource(url) results in a playback failure and errors in the logs as described.

The best way to maintain quality between sessions is to instantiate a new instance of HLS.js with each item, and update the player configuration for each player to use the estimated bandwidth (abrEwmaDefaultEstimate) based on conditions (hls.bandwidthEstimate) from the last session.

robwalch avatar Aug 01 '22 21:08 robwalch

Closing, as hls.loadSource(hls.url) works in the latest release (v1.4.6).

robwalch avatar Jun 19 '23 17:06 robwalch