video-dev / hls.js

HLS.js is a JavaScript library that plays HLS in browsers with support for MSE.
https://hlsjs.video-dev.org/demo
Other
14.68k stars 2.56k forks source link

setMediaKeys not return promise on low Chrome version(<=38) #6663

Open JackPu opened 2 weeks ago

JackPu commented 2 weeks ago

What version of Hls.js are you using?

1.5.14

What browser (including version) are you using?

Chrome38.x

What OS (including version) are you using?

Mac OS

Test stream

https://storage.googleapis.com/shaka-demo-assets/angel-one-widevine-hls/hls.m3u8

Configuration

{
  "debug": true,
  "enableWorker": false,
  "lowLatencyMode": true,
  "backBufferLength": 15,
  "startPosition": 2410.252039,
  "startLevel": 1,
  "shouldRemoveUsedBuffer": true,
  "widevineLicenseUrl": "https://cwip-shaka-proxy.appspot.com/no_auth",
  "emeEnabled": true
}

Additional player setup steps

No response

Checklist

Steps to reproduce

  1. Load the demo page https://hlsjs.video-dev.org/demo/?src=https%3A%2F%2Fstorage.googleapis.com%2Fshaka-demo-assets%2Fangel-one-widevine-hls%2Fhls.m3u8&demoConfig=eyJlbmFibGVTdHJlYW1pbmciOnRydWUsImF1dG9SZWNvdmVyRXJyb3IiOnRydWUsInN0b3BPblN0YWxsIjpmYWxzZSwiZHVtcGZNUDQiOmZhbHNlLCJsZXZlbENhcHBpbmciOi0xLCJsaW1pdE1ldHJpY3MiOi0xfQ== in the special chrome version
  2. After a few seconds, click the detach media button
  3. Check the console log

Expected behaviour

No Error thrown

What actually happened?

WX20240830-130335@2x WX20240830-110837@2x Throw an error catch in undefined

I guess it could be the line:

https://github.com/video-dev/hls.js/blob/01f50bbbccdf6dea92460b003c78d37a5ecf904e/src/controller/eme-controller.ts#L1256-L1259

media?.setMediaKeys(null) return undefined here. We may remove the catch.

Console output

loadSelectedStream] extending hls config with stream-specific config:  Object {widevineLicenseUrl: "https://cwip-shaka-proxy.appspot.com/no_auth", emeEnabled: true} main.js:341
Using Hls.js config: Object {debug: true, enableWorker: true, lowLatencyMode: true, backBufferLength: 90, widevineLicenseUrl: "https://cwip-shaka-proxy.appspot.com/no_auth"} main.js:350
[log] > Debug logs enabled for "Hls instance" in hls.js version 1.5.14 logger.ts:74
[log] > stopLoad hls.ts:442
[log] > loadSource:https://storage.googleapis.com/shaka-demo-assets/angel-one-widevine-hls/hls.m3u8 hls.ts:410
[log] > [stream-controller]: Trigger BUFFER_RESET stream-controller.ts:576
[log] > attachMedia hls.ts:380
[log] > [buffer-controller] created media source: MediaSource buffer-controller.ts:198
[log] > [level-controller]: manifest loaded, 5 level(s) found, first bitrate: 831086 level-controller.ts:337
[log] > setting initial bwe to 831086 abr-controller.ts:58
[log] > [buffer-controller] 2 bufferCodec event(s) expected buffer-controller.ts:186
[log] > [abr] picked start tier {"codecSet":"avc1,mp4a","videoRanges":["SDR"],"preferHDR":false,"minFramerate":0,"minBitrate":831086} abr-controller.ts:701
[info] > [abr] switch candidate:0->0 adjustedbw(831086)-bitrate=0 ttfb:0.1 avgDuration:0.0 maxFetchDuration:4.0 fetchDuration:0.1 firstSelection:true codecSet:avc1,mp4a videoRange:SDR hls.loadLevel:-1 abr-controller.ts:855
[log] > startLoad(-1) hls.ts:431
[log] > [level-controller]: Switching to level 0 (144p SDR avc1,mp4a @831086) from level -1 level-controller.ts:432
[log] > [audio-track-controller]: Updating audio tracks, 6 track(s) found in group(s): default-audio-group audio-track-controller.ts:186
[log] > [audio-track-controller]: Switching to audio-track 0 "stream_6" lang:en group:default-audio-group channels:6 audio-track-controller.ts:332
[log] > [audio-stream-controller]: Reset loading state base-stream-controller.ts:1659
[log] > [audio-stream-controller]: STOPPED->IDLE base-stream-controller.ts:1801
[log] > [subtitle-track-controller]: Updating subtitle tracks, 4 track(s) found in "default-text-group" group-id subtitle-track-controller.ts:276
[log] > [level-controller]: Loading level index 0 with https://storage.googleapis.com/shaka-demo-assets/angel-one-widevine-hls/playlist_v-0144p-0100k-libx264.mp4.m3u8 level-controller.ts:600
[log] > [stream-controller]: STOPPED->IDLE base-stream-controller.ts:1801
[log] > [audio-track-controller]: loading audio-track playlist 0 "stream_6" lang:en group:default-audio-group audio-track-controller.ts:422
[log] > [audio-stream-controller]: IDLE->STOPPED base-stream-controller.ts:1801
[log] > [audio-stream-controller]: STOPPED->WAITING_TRACK base-stream-controller.ts:1801
[log] > [subtitle-stream-controller]: STOPPED->IDLE base-stream-controller.ts:1801
[log] > [buffer-controller] Media source opened buffer-controller.ts:994
[log] > [subtitle-track-controller]: Switching to subtitle-track 0 "stream_0" lang:en group:default-text-group subtitle-track-controller.ts:524
[log] > [subtitle-track-controller]: Loading subtitle playlist for id 0 subtitle-track-controller.ts:437
[log] > [stream-controller]: Level 0 loaded [0,14][part-14--1], cc [0, 1] duration:60 stream-controller.ts:639
[log] > [buffer-controller] Updating Media Source duration to 60.000 buffer-controller.ts:861
[log] > [eme] Selecting key-system from fragment (sn: 2 main: 0) key formats urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed eme-controller.ts:388
[log] > [eme] Requesting encrypted media "com.widevine.alpha" key-system access with config: [{"initDataTypes":["cenc"],"persistentState":"optional","distinctiveIdentifier":"optional","sessionTypes":["temporary"],"audioCapabilities":[{"contentType":"audio/mp4; codecs=\"mp4a.40.2\"","robustness":"","encryptionScheme":null}],"videoCapabilities":[{"contentType":"video/mp4; codecs=\"avc1.42c01e\"","robustness":"","encryptionScheme":null},{"contentType":"video/mp4; codecs=\"avc1.4d401f\"","robustness":"","encryptionScheme":null}]}] eme-controller.ts:256
[log] > [stream-controller]: Loading fragment initSegment cc: 0 of [0-14] level: 0, target: 0 base-stream-controller.ts:758
[log] > [stream-controller]: IDLE->FRAG_LOADING base-stream-controller.ts:1801
[log] > [eme] Failed to obtain access to key-system "com.widevine.alpha": Error: Configured requestMediaKeySystemAccess is not a function null eme-controller.ts:270
[log] > [audio-track-controller]: Audio track 0 "stream_6" lang:en group:default-audio-group loaded [0-14] audio-track-controller.ts:100
[log] > [audio-stream-controller]: Audio track 0 loaded [0,14][part-14--1],duration:60 audio-stream-controller.ts:518
[log] > [audio-stream-controller]: WAITING_TRACK->IDLE base-stream-controller.ts:1801
[log] > [audio-stream-controller]: Loading fragment initSegment cc: 0 of [0-14] track: 0, target: 0 base-stream-controller.ts:758
[log] > [audio-stream-controller]: IDLE->FRAG_LOADING base-stream-controller.ts:1801
[log] > [subtitle-track-controller]: Subtitle track 0 "stream_0" lang:en group:default-text-group loaded [0-15] subtitle-track-controller.ts:188
[log] > [subtitle-stream-controller]: Subtitle track 0 loaded [0,15][part-15--1],duration:64 subtitle-stream-controller.ts:283
[log] > [subtitle-stream-controller]: Loading fragment 0 cc: 0 of [0-15] track: 0, target: 0 base-stream-controller.ts:758
[log] > [subtitle-stream-controller]: IDLE->FRAG_LOADING base-stream-controller.ts:1801
[log] > [stream-controller]: FRAG_LOADING->IDLE base-stream-controller.ts:1801
[log] > [stream-controller]: Loading fragment 0 cc: 0 of [0-14] level: 0, target: 0 base-stream-controller.ts:758
[log] > [stream-controller]: IDLE->FRAG_LOADING base-stream-controller.ts:1801
[log] > [audio-stream-controller]: FRAG_LOADING->IDLE base-stream-controller.ts:1801
[log] > [audio-stream-controller]: Loading fragment 0 cc: 0 of [0-14] track: 0, target: 0 base-stream-controller.ts:758
[log] > [audio-stream-controller]: IDLE->FRAG_LOADING base-stream-controller.ts:1801
[log] > [subtitle-stream-controller]: Loaded fragment 0 of level 0 base-stream-controller.ts:389
[log] > injecting Web Worker for "main" transmuxer-interface.ts:88
[log] > [transmuxer-interface, main]: Starting new transmux session for sn: 0 p: -1 level: 0 id: 1
        discontinuity: true
        trackSwitch: true
        contiguous: false
        accurateTimeOffset: true
        timeOffset: 0
        initSegmentChange: true transmuxer-interface.ts:230
[log] > [stream-controller]: Loaded fragment 0 of level 0 base-stream-controller.ts:389
[log] > injecting Web Worker for "audio" transmuxer-interface.ts:88
[log] > [audio-stream-controller]: Unknown video PTS for cc 0, waiting for video PTS before demuxing audio frag 0 of [0 ,14],track 0 audio-stream-controller.ts:637
[log] > [audio-stream-controller]: FRAG_LOADING->WAITING_INIT_PTS base-stream-controller.ts:1801
[log] > [audio-stream-controller]: Loaded fragment 0 of level 0 base-stream-controller.ts:389
[log] > Debug logs enabled for "main" in hls.js version 1.5.14 ef4a107d-778c-445b-93eb-296f84625918:555
[log] > Debug logs enabled for "audio" in hls.js version 1.5.14 6fba2872-d9f7-44a6-b41f-2b646469dc9d:555
[warn] > Error in "main" Web Worker, fallback to inline transmuxer-interface.ts:99
[log] > [stream-controller]: Reset loading state base-stream-controller.ts:1659
[log] > [stream-controller]: FRAG_LOADING->IDLE base-stream-controller.ts:1801
[log] > [audio-stream-controller]: WAITING_INIT_PTS->IDLE base-stream-controller.ts:1801
[log] > [audio-stream-controller]: Reset loading state base-stream-controller.ts:1659
Error event: Object {type: "otherError", details: "internalException", fatal: false, event: "demuxerWorker", error: Error: Uncaught TypeError: undefined is not a function  (blob:https%3A//hlsjs.video-dev.org/ef4a107d} main.js:745
Uncaught TypeError: undefined is not a function ef4a107d-778c-445b-93eb-296f84625918:1722
[warn] > [abr] Could not find best starting auto level. Defaulting to first in playlist 0 clamped to 0 abr-controller.ts:482
[log] > [stream-controller]: Loading fragment 0 cc: 0 of [0-14] level: 0, target: 0 base-stream-controller.ts:758
[log] > [stream-controller]: IDLE->FRAG_LOADING base-stream-controller.ts:1801
[log] > [audio-stream-controller]: Loading fragment 0 cc: 0 of [0-14] track: 0, target: 0 base-stream-controller.ts:758
[log] > [audio-stream-controller]: IDLE->FRAG_LOADING base-stream-controller.ts:1801
[log] > [transmuxer-interface, main]: Starting new transmux session for sn: 0 p: -1 level: 0 id: 1
        discontinuity: true
        trackSwitch: true
        contiguous: false
        accurateTimeOffset: true
        timeOffset: 0
        initSegmentChange: true transmuxer-interface.ts:230
[log] > [stream-controller]: FRAG_LOADING->PARSING base-stream-controller.ts:1801
[log] > [stream-controller]: Init video buffer, container:video/mp4, codecs[level/parsed]=[avc1.42c01e/avc1.42C01E] stream-controller.ts:1314
[log] > [buffer-controller] 1 bufferCodec event(s) expected video buffer-controller.ts:393
[log] > [audio-stream-controller]: InitPTS for cc: 0 found from main: 0 audio-stream-controller.ts:134
[log] > [subtitle-stream-controller]: FRAG_LOADING->IDLE base-stream-controller.ts:1801
[log] > [subtitle-stream-controller]: Buffered subtitle sn: 0 of track 0 (frag:[NaN-NaN] > buffer:[0.000-4.000]) base-stream-controller.ts:570
[log] > [subtitle-stream-controller]: Loading fragment 0 cc: 0 of [0-15] track: 0, target: 4 base-stream-controller.ts:758
[log] > [subtitle-stream-controller]: IDLE->FRAG_LOADING base-stream-controller.ts:1801
[log] > [stream-controller]: Loaded fragment 0 of level 0 base-stream-controller.ts:389
[log] > [transmuxer.ts]: Flushed fragment 0 of level 0 transmuxer.ts:267
[log] > [stream-controller]: PARSING->PARSED base-stream-controller.ts:1801
[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 transmuxer-interface.ts:230
[log] > [audio-stream-controller]: FRAG_LOADING->PARSING base-stream-controller.ts:1801
[log] > [audio-stream-controller]: Init audio buffer, container:audio/mp4, codecs[level/parsed]=[mp4a.40.2/mp4a.40.2] audio-stream-controller.ts:900
[log] > [buffer-controller] 0 bufferCodec event(s) expected audio buffer-controller.ts:393
[log] > [buffer-controller] creating sourceBuffer(video/mp4;codecs=avc1.42c01e) buffer-controller.ts:943
[log] > [buffer-controller] creating sourceBuffer(audio/mp4;codecs=mp4a.40.2) buffer-controller.ts:943
[log] > [stream-controller]: Alternate track found, use video.buffered to schedule main fragment loading stream-controller.ts:850
[log] > [audio-stream-controller]: Loaded fragment 0 of level 0 base-stream-controller.ts:389
[log] > [transmuxer.ts]: Flushed fragment 0 of level 0 transmuxer.ts:267
[log] > [audio-stream-controller]: PARSING->PARSED base-stream-controller.ts:1801
[log] > [subtitle-stream-controller]: Loaded fragment 0 of level 0 base-stream-controller.ts:389
[log] > [subtitle-stream-controller]: FRAG_LOADING->IDLE base-stream-controller.ts:1801
[log] > [subtitle-stream-controller]: Buffered subtitle sn: 0 of track 0 (frag:[NaN-NaN] > buffer:[0.000-4.000]) base-stream-controller.ts:570
[log] > [subtitle-stream-controller]: Loading fragment 1 cc: 0 of [0-15] track: 0, target: 4 base-stream-controller.ts:758
[log] > [subtitle-stream-controller]: IDLE->FRAG_LOADING base-stream-controller.ts:1801
[log] > [subtitle-stream-controller]: Loaded fragment 1 of level 0 base-stream-controller.ts:389
[log] > [subtitle-stream-controller]: FRAG_LOADING->IDLE base-stream-controller.ts:1801
[log] > [subtitle-stream-controller]: Buffered subtitle sn: 1 of track 0 (frag:[NaN-NaN] > buffer:[0.000-8.000]) base-stream-controller.ts:570
[log] > [subtitle-stream-controller]: Loading fragment 2 cc: 0 of [0-15] track: 0, target: 8 base-stream-controller.ts:758
[log] > [subtitle-stream-controller]: IDLE->FRAG_LOADING base-stream-controller.ts:1801
[log] > [subtitle-stream-controller]: Loaded fragment 2 of level 0 base-stream-controller.ts:389
[log] > [subtitle-stream-controller]: FRAG_LOADING->IDLE base-stream-controller.ts:1801
[log] > [subtitle-stream-controller]: Buffered subtitle sn: 2 of track 0 (frag:[NaN-NaN] > buffer:[0.000-12.000]) base-stream-controller.ts:570
[log] > [subtitle-stream-controller]: Loading fragment 3 cc: 0 of [0-15] track: 0, target: 12 base-stream-controller.ts:758
[log] > [subtitle-stream-controller]: IDLE->FRAG_LOADING base-stream-controller.ts:1801
[log] > [subtitle-stream-controller]: Loaded fragment 3 of level 0 base-stream-controller.ts:389
[log] > [subtitle-stream-controller]: FRAG_LOADING->IDLE base-stream-controller.ts:1801
[log] > [subtitle-stream-controller]: Buffered subtitle sn: 3 of track 0 (frag:[NaN-NaN] > buffer:[0.000-16.000]) base-stream-controller.ts:570
[log] > [subtitle-stream-controller]: Loading fragment 4 cc: 0 of [0-15] track: 0, target: 16 base-stream-controller.ts:758
[log] > [subtitle-stream-controller]: IDLE->FRAG_LOADING base-stream-controller.ts:1801
[log] > [subtitle-stream-controller]: Loaded fragment 4 of level 0 base-stream-controller.ts:389
[log] > [subtitle-stream-controller]: FRAG_LOADING->IDLE base-stream-controller.ts:1801
[log] > [subtitle-stream-controller]: Buffered subtitle sn: 4 of track 0 (frag:[NaN-NaN] > buffer:[0.000-20.000]) base-stream-controller.ts:570
[log] > [subtitle-stream-controller]: Loading fragment 5 cc: 0 of [0-15] track: 0, target: 20 base-stream-controller.ts:758
[log] > [subtitle-stream-controller]: IDLE->FRAG_LOADING base-stream-controller.ts:1801
[log] > [stream-controller]: Buffered main sn: 0 of level 0 (frag:[0.000-4.000] > buffer:[0.000-4.000]) base-stream-controller.ts:570
[log] > [stream-controller]: PARSED->IDLE base-stream-controller.ts:1801
[info] > [abr] switch candidate:0->2 adjustedbw(5833473)-bitrate=1825211 ttfb:0.0 avgDuration:4.0 maxFetchDuration:4.0 fetchDuration:3.0 firstSelection:false codecSet:avc1,mp4a videoRange:SDR hls.loadLevel:0 abr-controller.ts:855
[log] > [stream-controller]: Adapting to level 2 from level 0 stream-controller.ts:268
[log] > [level-controller]: Switching to level 2 (360p SDR avc1,mp4a @4008262) from level 0 level-controller.ts:432
[log] > [level-controller]: Loading level index 2 with https://storage.googleapis.com/shaka-demo-assets/angel-one-widevine-hls/playlist_v-0360p-0750k-libx264.mp4.m3u8 level-controller.ts:600
[log] > [stream-controller]: IDLE->WAITING_LEVEL base-stream-controller.ts:1801
[log] > [audio-stream-controller]: Buffered audio sn: 0 of track 0 (frag:[0.000-4.032] > buffer:[0.021-4.032]) base-stream-controller.ts:570
[log] > [audio-stream-controller]: PARSED->IDLE base-stream-controller.ts:1801
[log] > [audio-stream-controller]: Loading fragment 1 cc: 0 of [0-14] track: 0, target: 4.032 base-stream-controller.ts:758
[log] > [audio-stream-controller]: IDLE->FRAG_LOADING base-stream-controller.ts:1801
[log] > [subtitle-stream-controller]: Loaded fragment 5 of level 0 base-stream-controller.ts:389
[log] > [subtitle-stream-controller]: FRAG_LOADING->IDLE base-stream-controller.ts:1801
[log] > [subtitle-stream-controller]: Buffered subtitle sn: 5 of track 0 (frag:[NaN-NaN] > buffer:[0.000-24.000]) base-stream-controller.ts:570
[log] > [subtitle-stream-controller]: Loading fragment 6 cc: 0 of [0-15] track: 0, target: 24 base-stream-controller.ts:758
[log] > [subtitle-stream-controller]: IDLE->FRAG_LOADING base-stream-controller.ts:1801
[log] > [audio-stream-controller]: FRAG_LOADING->PARSING base-stream-controller.ts:1801
[log] > [audio-stream-controller]: Loaded fragment 1 of level 0 base-stream-controller.ts:389
[log] > [transmuxer.ts]: Flushed fragment 1 of level 0 transmuxer.ts:267
[log] > [audio-stream-controller]: PARSING->PARSED base-stream-controller.ts:1801
[log] > [stream-controller]: Level 2 loaded [0,14][part-14--1], cc [0, 1] duration:60 stream-controller.ts:639
[log] > [stream-controller]: WAITING_LEVEL->IDLE base-stream-controller.ts:1801
[log] > [stream-controller]: Loading fragment initSegment cc: 0 of [0-14] level: 2, target: 0 base-stream-controller.ts:758
[log] > [stream-controller]: IDLE->FRAG_LOADING base-stream-controller.ts:1801
[log] > [subtitle-stream-controller]: Loaded fragment 6 of level 0 base-stream-controller.ts:389
[log] > [subtitle-stream-controller]: FRAG_LOADING->IDLE base-stream-controller.ts:1801
[log] > [subtitle-stream-controller]: Buffered subtitle sn: 6 of track 0 (frag:[NaN-NaN] > buffer:[0.000-28.000]) base-stream-controller.ts:570
[log] > [subtitle-stream-controller]: Loading fragment 7 cc: 0 of [0-15] track: 0, target: 28 base-stream-controller.ts:758
[log] > [subtitle-stream-controller]: IDLE->FRAG_LOADING base-stream-controller.ts:1801
[log] > [subtitle-stream-controller]: Loaded fragment 7 of level 0 base-stream-controller.ts:389
[log] > [subtitle-stream-controller]: FRAG_LOADING->IDLE base-stream-controller.ts:1801
[log] > [subtitle-stream-controller]: Buffered subtitle sn: 7 of track 0 (frag:[NaN-NaN] > buffer:[0.000-32.000]) base-stream-controller.ts:570
[log] > [subtitle-stream-controller]: Loading fragment 8 cc: 0 of [0-15] track: 0, target: 32 base-stream-controller.ts:758
[log] > [subtitle-stream-controller]: IDLE->FRAG_LOADING base-stream-controller.ts:1801
[log] > [audio-stream-controller]: Buffered audio sn: 1 of track 0 (frag:[4.032-8.021] > buffer:[0.021-8.021]) base-stream-controller.ts:570
[log] > [audio-stream-controller]: PARSED->IDLE base-stream-controller.ts:1801
[log] > [subtitle-stream-controller]: Loaded fragment 8 of level 0 base-stream-controller.ts:389
[log] > [subtitle-stream-controller]: FRAG_LOADING->IDLE base-stream-controller.ts:1801
[log] > [subtitle-stream-controller]: Buffered subtitle sn: 8 of track 0 (frag:[NaN-NaN] > buffer:[0.000-36.000]) base-stream-controller.ts:570
[log] > [stream-controller]: FRAG_LOADING->IDLE base-stream-controller.ts:1801
[log] > [stream-controller]: Loading fragment 1 cc: 0 of [0-14] level: 2, target: 4 base-stream-controller.ts:758
[log] > [stream-controller]: IDLE->FRAG_LOADING base-stream-controller.ts:1801
[log] > [transmuxer-interface, main]: Starting new transmux session for sn: 1 p: -1 level: 2 id: 1
        discontinuity: false
        trackSwitch: true
        contiguous: false
        accurateTimeOffset: true
        timeOffset: 4
        initSegmentChange: true transmuxer-interface.ts:230
[log] > [stream-controller]: FRAG_LOADING->PARSING base-stream-controller.ts:1801
[log] > [stream-controller]: Init video buffer, container:video/mp4, codecs[level/parsed]=[avc1.4d401f/avc1.4D401F] stream-controller.ts:1314
[log] > [stream-controller]: Loaded fragment 1 of level 2 base-stream-controller.ts:389
[log] > [transmuxer.ts]: Flushed fragment 1 of level 2 transmuxer.ts:267
[log] > [stream-controller]: PARSING->PARSED base-stream-controller.ts:1801
[log] > detachMedia hls.ts:389
[log] > [buffer-controller] media source detaching buffer-controller.ts:246
Uncaught TypeError: undefined is not a function eme-controller.ts:1226

Chrome media internals output

No response

robwalch commented 2 weeks ago

The compatibility section of the README states that HLS.js is supported on Chrome 39 and up.

https://github.com/video-dev/hls.js?tab=readme-ov-file#compatibility

Would you like to submit a PR to avoid this escape, assuming that optional chaining resolves the exception described above media?.setMediaKeys(null)?.catch((error) => {?

Was media detached intentionally or is the exception described a result of tear-down after a larger compatibility related issue?

JackPu commented 2 weeks ago

Sorry about ignoring the compatibility document about the hls.js usage.

And I would like to submit a PR to avoid the special case from your suggestion.