Comments (2)
Hello,
Interesting, I thought we completely fixed those types of Tizen issues. Which RxPlayer version are you using?
For a little bit of history and explanation, Tizen is a peculiar platform which do not seek where we tell it to seek but instead to a close position where it thinks it will be able to restart playback faster.
For example, the RxPlayer may want to seek at a position, say, 10.5
seconds at some point and tell Tizen's browser to do that, but in turn, the position will end up to be at 10.2
seconds instead because Tizen would have thought that this is a better position to restart playback from.
To our understanding, this does not respect the HTML WHATWG standard (and is not observed in any other implementation) and we exchanged with Samsung about this, but they did not want to change this behavior, for different reasons.
However, developing a multi-platform media player is complex as many unexpected scenarios may happen anywhere in the whole stack (from hardware and drivers to the RxPlayer), which we have to detect and work-around.
Thus we have a lot of heuristics and guards to ensure that playback goes well, by ensuring that nothing seems off. Among them, we detect when there is an unexpected "hole" in the buffer which no media segment seems to fill. We call this a "discontinuity", here in the RxPlayer.
The RebufferingController
, an RxPlayer "module" (basically an independent subpart of the RxPlayer), monitors where discontinuity appears and "jumps" over it as soon as they are encountered, to directly go to the part after it. That's when it does that that the DISCOUNTINUITY_ENCOUNTERED
warning is sent (with in its message, both the position at which we 'were in and the position the RxPlayer has seeked to).
But with Tizen, those seeks to skip discontinuities may be brought back to a position milliseconds before, often "inside" the corresponding discontinuity hole.
Thus the RxPlayer re-detects the discontinuity, we re-seek after it and so on, in a loop.
Because that discontinuity monitoring logic is central to the RxPlayer, we in the end preferred to keep that logic that way and to just add exceptions for Tizen: If the position appears to abnormally go back in time on Tizen, we forbid further seeks for 5 seconds (if 5 seconds have elapsed and we're still locked at the previous position, we re-enable the discontinuity-skipping logic because Tizen may actually really be stuck on the discontinuity).
As far as we know, this logic fixed all Tizen auto-seeking issues we were previously having.
In logs, if you enabled "DEBUG"
verbosity, you should see:
Init: the device appeared to have seeked back by itself.
When we detect that Tizen has seeked back. From this point, we will forbid discontinuity-seeking for 5 seconds.
Init: letting the device get out of a stall by itself
When playback is still stuck but the RxPlayer is letting Tizen try to get out of a discontinuity by itself due to the 5 seconds rules explained earlier.
And:
Init: ignored stall for too long, checking discontinuity
If those 5 seconds have passed but Tizen wasn't able to get out of the hole.
Do you see any of these logs when the problematic behavior arises?
from rx-player.
Hi,
Thanks for the explanation! I'm using rxPlayer v 3.30.0
In the "DEBUG" logs, I can find all of the logs you mentioned. In between of one discontinuity warning and another I can find logs like:
Init: ignored stall for too long, checking discontinuity 5008.799999995972
Init: Pause playback to build buffer
Init: discontinuity found 1685445536.241 1685445536.4072292
SA: skippable discontinuity found in the stream 1685445536.168 1685445536.408229
API: Sending warning: t: MediaError (DISCONTINUITY_ENCOUNTERED) A discontinuity has been encountered at position 1685445536.241, seeked at position 1685445536.408229
SI: Pushing segment strictly after previous one. audio 1685445545.9905624 1685445545.99
AVSB: Acknowledging complete segment audio P: 1 A: 2 R: audio_112035_fra=112000 S: 1685445545.9905624-1.92
SI: found true buffered end audio 1685445547.91 1685445547.9105625
SI: current audio inventory timeline:
1685445534.17|A|1685445536.24 ~ 1685445536.39|A|1685445547.91
[A] P: 1 || R: audio_112035_fra=112000(112000)
API: current media element state tick event ratechange position 1685445536.408229 seeking true internalSeek null rebuffering false freezing false ended false paused false playbackRate 0 readyState 2
API: current playback timeline:
1685445534.17|==2.07==|1685445536.24 ~0.15~ 1685445536.39|==11.52==|1685445547.91
ratechange
ABR: Choosing representation with bandwidth estimation. 4714400 video=4714400
SI: current video inventory timeline:
1685445501.91|A|1685445503.83 ~ 1685445503.83|B|1685445505.67 ~ 1685445505.67|C|1685445509.51 ~ 1685445509.51|D|1685445513.35 ~ 1685445513.35|B|1685445515.27 ~ 1685445515.27|E|1685445517.19 ~ 1685445517.19|F|1685445555.67
[A] P: 1 || R: video=3590400(3590400)
[B] P: 1 || R: video=1444800(1444800)
[C] P: 1 || R: video=648000(648000)
[D] P: 1 || R: video=1066800(1066800)
[E] P: 1 || R: video=2671200(2671200)
[F] P: 1 || R: video=4714400(4714400)
SI: current audio inventory timeline:
1685445534.17|A|1685445536.24 ~ 1685445536.39|A|1685445547.91
[A] P: 1 || R: audio_112035_fra=112000(112000)
RS: future discontinuity encountered audio 1685445536.241 1685445536.3905625
Init: Resume playback speed 1
API: playerStateChange event PLAYING
^1685445536.408229
seeking
ABR: Choosing representation with bandwidth estimation. 4714400 video=4714400
SI: current video inventory timeline:
1685445501.91|A|1685445503.83 ~ 1685445503.83|B|1685445505.67 ~ 1685445505.67|C|1685445509.51 ~ 1685445509.51|D|1685445513.35 ~ 1685445513.35|B|1685445515.27 ~ 1685445515.27|E|1685445517.19 ~ 1685445517.19|F|1685445555.67
[A] P: 1 || R: video=3590400(3590400)
[B] P: 1 || R: video=1444800(1444800)
[C] P: 1 || R: video=648000(648000)
[D] P: 1 || R: video=1066800(1066800)
[E] P: 1 || R: video=2671200(2671200)
[F] P: 1 || R: video=4714400(4714400)
SI: current audio inventory timeline:
1685445534.17|A|1685445536.24 ~ 1685445536.39|A|1685445547.91
[A] P: 1 || R: audio_112035_fra=112000(112000)
RS: current discontinuity encountered audio 1685445536.3905625
ratechange
ABR: Choosing representation with bandwidth estimation. 4714400 video=4714400
SI: current video inventory timeline:
1685445501.91|A|1685445503.83 ~ 1685445503.83|B|1685445505.67 ~ 1685445505.67|C|1685445509.51 ~ 1685445509.51|D|1685445513.35 ~ 1685445513.35|B|1685445515.27 ~ 1685445515.27|E|1685445517.19 ~ 1685445517.19|F|1685445555.67
[A] P: 1 || R: video=3590400(3590400)
[B] P: 1 || R: video=1444800(1444800)
[C] P: 1 || R: video=648000(648000)
[D] P: 1 || R: video=1066800(1066800)
[E] P: 1 || R: video=2671200(2671200)
[F] P: 1 || R: video=4714400(4714400)
SI: current audio inventory timeline:
1685445534.17|A|1685445536.24 ~ 1685445536.39|A|1685445547.91
[A] P: 1 || R: audio_112035_fra=112000(112000)
RS: current discontinuity encountered audio 1685445536.3905625
SI: Pushing segment strictly after previous one. audio 1685445547.9105625 1685445547.91
timeupdate
ABR: Choosing representation with bandwidth estimation. 4714400 video=4714400
SI: current video inventory timeline:
1685445501.91|A|1685445503.83 ~ 1685445503.83|B|1685445505.67 ~ 1685445505.67|C|1685445509.51 ~ 1685445509.51|D|1685445513.35 ~ 1685445513.35|B|1685445515.27 ~ 1685445515.27|E|1685445517.19 ~ 1685445517.19|F|1685445557.59
[A] P: 1 || R: video=3590400(3590400)
[B] P: 1 || R: video=1444800(1444800)
[C] P: 1 || R: video=648000(648000)
[D] P: 1 || R: video=1066800(1066800)
[E] P: 1 || R: video=2671200(2671200)
[F] P: 1 || R: video=4714400(4714400)
SI: current audio inventory timeline:
1685445534.43|A|1685445536.24 ~ 1685445536.39|A|1685445540.23
[A] P: 1 || R: audio_112035_fra=112000(112000)
RS: future discontinuity encountered audio 1685445536.241 1685445536.3905625
Init: letting the device get out of a stall by itself
SI: Pushing segment strictly after previous one. audio 1685445540.2305624 1685445540.23
AVSB: Acknowledging complete segment audio P: 1 A: 2 R: audio_112035_fra=112000 S: 1685445540.2305624-1.92
SI: found true buffered end audio 1685445542.15 1685445542.1505625
SI: current audio inventory timeline:
1685445534.43|A|1685445536.24 ~ 1685445536.39|A|1685445542.15
seeked
ABR: Choosing representation with bandwidth estimation. 4714400 video=4714400
SI: current video inventory timeline:
1685445501.91|A|1685445503.83 ~ 1685445503.83|B|1685445505.67 ~ 1685445505.67|C|1685445509.51 ~ 1685445509.51|D|1685445513.35 ~ 1685445513.35|B|1685445515.27 ~ 1685445515.27|E|1685445517.19 ~ 1685445517.19|F|1685445555.67
[A] P: 1 || R: video=3590400(3590400)
[B] P: 1 || R: video=1444800(1444800)
[C] P: 1 || R: video=648000(648000)
[D] P: 1 || R: video=1066800(1066800)
[E] P: 1 || R: video=2671200(2671200)
[F] P: 1 || R: video=4714400(4714400)
Stream: no more media segment to request. Cancelling queue. video
SI: current video inventory timeline:
1685445501.91|A|1685445503.83 ~ 1685445503.83|B|1685445505.67 ~ 1685445505.67|C|1685445509.51 ~ 1685445509.51|D|1685445513.35 ~ 1685445513.35|B|1685445515.27 ~ 1685445515.27|E|1685445517.19 ~ 1685445517.19|F|1685445555.67
[A] P: 1 || R: video=3590400(3590400)
[B] P: 1 || R: video=1444800(1444800)
[C] P: 1 || R: video=648000(648000)
[D] P: 1 || R: video=1066800(1066800)
[E] P: 1 || R: video=2671200(2671200)
[F] P: 1 || R: video=4714400(4714400)
Stream: Media segments now need to be requested. Starting queue. audio 10
SF: Beginning request audio P: 1 A: 1 R: audio_112034_deu=112000 S: 1685445536.3905625-1.92
Init: the device appeared to have seeked back by itself.
API: current media element state tick event canplay position 1685445534.548 seeking false internalSeek null rebuffering false freezing false ended false paused false playbackRate 1 readyState 3
API: current playback timeline:
from rx-player.
Related Issues (20)
- KEY_GENERATE_REQUEST_ERROR - The initDataType parameter is empty (observed on Tizen 2017) HOT 7
- Video playback issues on Android Mobile in Chrome HOT 9
- Check Dolby Atmos and Dolby Vision in current stream HOT 3
- Unable to play some streams in Edge browser on RxPlayer v3.30.0 HOT 11
- Streams freeze on first frame with audio only playback on Edge browser (and probably Chrome) HOT 6
- Safari 17 brings MSE to iOS HOT 10
- Some DASH/Widevine streams are looping on a Vestel MB130 HOT 3
- First playback of PlayReady content fails on EDGE browsers HOT 3
- PIPELINE_ERROR_DECODE error observed in Edge browser when zapping live channels HOT 2
- Safari 17.1 issue with playback DRM content HOT 3
- playing MKV VOD with multi Audio track HOT 7
- Infinity loading state on Safari Mobile when autoplay is false HOT 17
- Arrêt brutal du player en Replay sur le mycanal sur HOT 4
- PIPELINE_ERROR_INVALID_STATE error when using Playready/Dash stream (mixed encrypted/unecrypted content) HOT 9
- fromFirstPosition does not start from actual first position in live DASH manifest (multi period live with SSAI) HOT 2
- Freezed VOD stream and lot of audio discontinuities on Samsung Tizen 2017 HOT 11
- Pre-fetching DRM licenses for current and future content
- Widevine LD fallback not triggering in RxPlayer HOT 7
- dashif:laurl not parsed after recent changes
- Resolve base url not correct when root MPD base url start with `/` HOT 2
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from rx-player.