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.81k stars 2.57k forks source link

Some video streams can't be played on microsoft edge chromium browser on windows 11 #4958

Closed adis0308 closed 1 year ago

adis0308 commented 2 years ago

What version of Hls.js are you using?

latest

What browser (including version) are you using?

microsoft edge chromium 106.0.1370.42 (official build) (64-bit)

What OS (including version) are you using?

windows 11

Test stream

https://hls-js.netlify.app/demo?src=https%3A%2F%2Fd3rlna7iyyu8wu.cloudfront.net%2Fskip_armstrong%2Fskip_armstrong_multi_language_subs.m3u8&demoConfig=eyJlbmFibGVTdHJlYW1pbmciOnRydWUsImF1dG9SZWNvdmVyRXJyb3IiOnRydWUsInN0b3BPblN0YWxsIjpmYWxzZSwiZHVtcGZNUDQiOmZhbHNlLCJsZXZlbENhcHBpbmciOi0xLCJsaW1pdE1ldHJpY3MiOi0xfQ==

Configuration

{
  "debug": true,
  "enableWorker": true,
  "lowLatencyMode": true,
  "backBufferLength": 90
}

Additional player setup steps

No response

Checklist

Steps to reproduce

There are no specific steps. The error occurred at the beginning, the video could not load at all.

Expected behaviour

The demo video must be playable in Microsoft Edge Browser on Windows 11.

What actually happened?

The video could not load at all.

hlsjs error hlsjs error 2

Console output

Please check on the demo site

Chrome media internals output

No response

adis0308 commented 2 years ago

I think I know the cause of the problem. The demo video has several sound groups such as aac_stereo, ac3_51, ec3_stereo, ec3_51. I can play videos with aac_stereo sound by first filtering the video and audio on the Hls.Events.MANIFEST_PARSED event. Maybe in the future the hls.js developers can choose the aac sound first although this might conflict with the default video/sound selection in the master.m3u8 file. My conclusion this is a sound codec compatibility issue on the browser or device.

robwalch commented 2 years ago

The byteLength of undefined exception looks like an issue with AES-128 that has been fixed in dev. If segments fail to be decrypted then the probe failures that follow would be expected. Please check against dev to see if the issue is still reproducible.

mtoczko commented 2 years ago

The byteLength of undefined exception looks like an issue with AES-128 that has been fixed in dev.

There the error came from timeline-controller, here we have a demuxer error. This is not related. It has a problem with ec-3 track support

[warn] > Failed to find demuxer by probing frag, treating as mp4 passthrough
[warn] > [passthrough-remuxer.ts]: initSegment does not contain moov or trak boxes.
[warn] > [passthrough-remuxer.ts]: Failed to generate initSegment.

Related to #4408

adis0308 commented 2 years ago

I get different warning messages

[warn] > [audio-stream-controller]: Found no media in fragment 0 of level 0 resetting transmuxer to fallback to playlist timing
updateLevelTiming @ base-stream-controller.ts:1427
_handleTransmuxerFlush @ base-stream-controller.ts:746
onWorkerMessage @ transmuxer-interface.ts:296
[warn] > Fragments must have at least one ElementaryStreamType set. type: audio level: 0 sn: 0
onFragParsed @ buffer-controller.ts:501
emit @ index.js:203
emit @ hls.ts:251
trigger @ hls.ts:259
updateLevelTiming @ base-stream-controller.ts:1433
_handleTransmuxerFlush @ base-stream-controller.ts:746
onWorkerMessage @ transmuxer-interface.ts:296

https://hls-js-56521345-fabc-472e-8348-f4a35c6237f1.netlify.app/demo/?src=https%3A%2F%2Fd3rlna7iyyu8wu.cloudfront.net%2Fskip_armstrong%2Fskip_armstrong_multi_language_subs.m3u8&demoConfig=eyJlbmFibGVTdHJlYW1pbmciOnRydWUsImF1dG9SZWNvdmVyRXJyb3IiOnRydWUsInN0b3BPblN0YWxsIjpmYWxzZSwiZHVtcGZNUDQiOmZhbHNlLCJsZXZlbENhcHBpbmciOi0xLCJsaW1pdE1ldHJpY3MiOi0xfQ==

adis0308 commented 2 years ago

As additional information that I have also tried to play videos on firefox 105.0.3 (64-bit) on the same windows 11 and the video can play normally without any problems

adis0308 commented 2 years ago

I was expecting the video to play by adding the setting defaultAudioCodec: mp4a.40.2 but it didn't work even though it was listed in the API documentation.

mtoczko commented 2 years ago

@adis0308 You could split this stream into 4 streams (aac, ec3_stereo, ac3, ec3)? So that the stream has only one audio group

robwalch commented 2 years ago

Confirmed in Windows 10 as well.

robwalch commented 2 years ago

Can you provide a little more information about the media itself.

HLS.js only support fmp4, TS, aac, and mp3 containers/file-formats. Raw EC3 files are not supported, even when the codec is supported by the browser. Use fmp4 or CMAF containers for all playlist segments.

robwalch commented 2 years ago

For now, with this stream on Chromium/Edge, using the current release (v1.2.4), you could manually select a start level on manifest loaded / levels updates that uses the AAC audio group. After that is loaded and the audio tracks updated you can put the player back in ABR mode and it should stick to AAC.

If you want EC3 playback where supported or if you want to use any codecs other than AVC and AAC, provide mp4 segmented playlists.

adis0308 commented 2 years ago

The video is a sample from Dolby Digital so it is Dolby AC3 and Dolby EC3. Yes for now I have solved that problem manually and filtered levels with:

hls.firstLevel = aacFindIndex;
hls.startLevel = aacFindIndex;
hls.currentLevel = aacFindIndex;

And

hls.removeLevel();
hls.swapAudioCodec();
hls.recoverMediaError(); 

Via:

Hls.Events.MANIFEST_PARSED
Hls.Events.LEVEL_UPDATED
Hls.Events.LEVEL_SWITCHED
Hls.Events.LEVEL_LOADED
Hls.Events.LEVEL_PTS_UPDATED
adis0308 commented 2 years ago

@mtoczko Yes, I did that. I added an audioCodec filter using MediaSource earlier. But still dolby ec3 detected can be run in the browser on the filtering results. The problem is because by default the first audio selected in the manifest is dolby ec3 so the result is [ec3, aac, ac3, ec3_51].

robwalch commented 1 year ago

The audio EXT-X-MEDIA tags SHOULD have a CHANNELS attribute but do not. Since this Playlist has EC3 in stereo and 5.1 surround for each language, the CHANNELS attribute is REQUIRED. HLS clients cannot pick between these options or convey that stereo and surround are available without the CHANNELS attribute.

robwalch commented 1 year ago

Hi @adis0308,

EC3 container-less is still not supported (EC3 audio must be provided in fragmented mp4), but AC3 support is present in dev.

Can you try again and provide feedback on how this is behaving in https://hlsjs-dev.video-dev.org/demo/ ? Thanks!