videojs / http-streaming

HLS, DASH, and future HTTP streaming protocols library for video.js
https://videojs-http-streaming.netlify.app/
Other
2.52k stars 424 forks source link

Live stream issues on Tizen 2.4 since 2.5.0 #1134

Closed JeppeTh closed 2 years ago

JeppeTh commented 3 years ago

Description

Since 2.5.0 I have issues with some HLS live streams. Hangs on repeated vhs-live-resync. Not sure how to gather more information...

Sources

Steps to reproduce

Results

Expected

On 2.4.2 playback starts

Error output

More than once per seconds I get Usage:vhs-live-resync State:0

Additional Information

videojs-http-streaming version

videojs-http-streaming 2.5.0

videojs version

Any video.js version.

Browsers

Platforms

Tizen 2.4

Other Plugins

Other JavaScript

welcome[bot] commented 3 years ago

👋 Thanks for opening your first issue here! 👋

If you're reporting a 🐞 bug, please make sure you include steps to reproduce it. We get a lot of issues on this repo, so please be patient and we will get back to you as soon as we can. To help make it easier for us to investigate your issue, please follow the contributing guidelines.

pmendozav commented 3 years ago

I had the same issue.. my guess was that it is related with the chromium version that tizen uses, there was an update related with pts/dts that was done for modern browsers

JeppeTh commented 3 years ago

I had the same issue.. my guess was that it is related with the chromium version that tizen uses, there was an update related with pts/dts that was done for modern browsers

"had"? So how was it solved you mean, by some chromium/browser update? Can you find out which chromium version my tizen is using with some debug call? From this spec it seems at least 2.4 is running webkit and not chromium... https://developer.samsung.com/smarttv/develop/specifications/web-engine-specifications.html

I have a 2020 TV as well - don't remember if I got this issue there or not...

JeppeTh commented 3 years ago

Analysed some more - it seems in 2.4.2 seekable.lenth equals 0 which means it will never end up in the resync part. In > 2.4.2 seekable.length is set to 1. But I guess the "beforeSeekableWindow" should check state or similar as well. At least it seem the seek to livePoint fails and we end up in a loop (i.e. currentTime is always 0)

This goes on forever: seekable.start(0): 8 seekable.end(0) : 28 Fell out of live window at time 0. Seeking to live point (seekable end) 28

seekable.start(0) : 8 seekable.end(0) : 28 Fell out of live window at time 0. Seeking to live point (seekable end) 28

JeppeTh commented 3 years ago

Adding a currentTime > 0 to the beforeSeekableWindow_ to avoid the loop didn't really make it work. Instead it ends up in stalled where it seems to hang forever - no events.

gkatsev commented 3 years ago

From what I can gather, though, I haven't tried it on a real device and the emulator isn't working for me, all these issues with old TVs is the switch from DTS to PTS in chrome and other browsers that we followed to support them. Unfortunately, there likely isn't a good way for us to support those older browsers which use DTS while supporting the newer browsers which use PTS. Our recommendation would be to pin the version of VHS to to 2.4.

JeppeTh commented 3 years ago

How can you notice that https://github.com/videojs/http-streaming/releases/tag/v2.5.0 changed anything related to DTS/PTS?

Is there anyway to confirm that this (=DTS vs PTS) is the issue I'm getting?

I tried once more with latest video.js and then actually any streams (not just live streams) fails to play - they end up in stalled instead of resync loop though....

pmendozav commented 3 years ago

The dummy way I used to check that the problem was related with pts/dts was: compiling http-streaming switching ptsTime -> dtsTime in segment.js

JeppeTh commented 3 years ago

Ok thx, but don't know how to build it... But diffing http-streaming.js between 2.4.2 and 2.5.0 showed no differences in the ptsTime occurences. But there might of course be other diffs causing it to end up at ptsTime instead of dtsTime...

JeppeTh commented 2 years ago

I changed ptsTime -> dtsTime and built manually, but still doesn't work. I don't see vhs-live-resync - but the reason for that could be that the live streams has changed something. I can't get any kind of stream working with 2.5 and pts->dts doesn't make a difference - all I get is stalled state.

Any other suggestions on differences between 2.5 and 2.4.2? I also noticed that already 2.4.2 uses ptsTime - changing back leads to the resync event again...

Also saw that vhs-utils had been stepped - tried to use the old version, lead to some compilation warning and still resync...

Tried b072c93 @ chore: update @videojs/vhs-utils to v3.0.0 (#1036) which doesn't work either. So I guess something in this one breaks...

JeppeTh commented 2 years ago

Seems I kind of solved it - but can't understand from/why there's a problem from b072c93

imported/videojs-http-streaming.min.js (4) :syncPoint for [time: 0] chosen with strategy [Playlist]: [time:0, segmentIndex:0] imported/videojs-http-streaming.min.js (4) :checkBuffer_ returning https://lbs-aws-hls.tv4play.se/group01/bbr-event1/live.isml/live-audio_0=128000-video=2499968-427287073.ts imported/videojs-http-streaming.min.js (4) :READY -> WAITING imported/videojs-http-streaming.min.js (4) :syncPoint for [time: 0] chosen with strategy [Playlist]: [time:0, segmentIndex:0] imported/videojs-http-streaming.min.js (4) :syncPoint for [time: 0] chosen with strategy [Playlist]: [time:0, segmentIndex:0] imported/videojs-http-streaming.min.js (3) :TypeError: 'undefined' is not a function (evaluating 'ArrayBuffer.isView(t)')

If I change to it works. var isTypedArray = function isTypedArray(obj) { try { return ArrayBuffer.isView(obj); } catch (e) { return false; } };

video-archivist-bot commented 2 years ago

Hey! We've detected some video files in a comment on this issue. If you'd like to permanently archive these videos and tie them to this project, a maintainer of the project can reply to this issue with the following commands:

gkatsev commented 2 years ago

Tizen's documentation seems to imply that TypedArrays on TVs weren't available until 3.0, but on mobile it was available on 2.4 (https://docs.tizen.org/application/web/guides/w3c/supplement/typedarray/#related-information). Are you running on TV or on Mobile?

Though, based on your comment, it seems like it worked with just gating the isTypedArray check in VHS-utils. I wonder if they have TypedArrays, but it isn't complete? Like ArrayBuffer.isView() is missing? According to MDN, ArrayBuffer was added in Chrome 7, but ArrayBuffer.isView() was added in Chrome 32.

JeppeTh commented 2 years ago

Yes running TV 2.4.

Do you want me to try var isTypedArray = function isTypedArray(obj) { return ArrayBuffer && ArrayBuffer.isView(obj);} instead?;

gkatsev commented 2 years ago

@JeppeTh can you check if ArrayBuffer.isView is available?

gkatsev commented 2 years ago

And whether stuff like Uint8Array are available.

JeppeTh commented 2 years ago

Yes sure - I'll check ArrayBuffer ArrayBuffer.isView Uint8Array

gkatsev commented 2 years ago

Thanks!

JeppeTh commented 2 years ago

Seems ArrayBuffer and Uint8Array exists but ArrayBuffer.isView is undefined as you were guessing.

gkatsev commented 2 years ago

Awesome! Thanks for checking. Then, I'll work on getting releases out tomorrow, but should then be fixed with https://github.com/videojs/vhs-utils/pull/33 and #1258

JeppeTh commented 2 years ago

Great - thx!

gkatsev commented 2 years ago

This is now published in Video.js 7.19.2!