-
Notifications
You must be signed in to change notification settings - Fork 1.5k
Description
Have you read the FAQ and checked for duplicate open issues?
Yes, there aren't existing issues.
Is your feature request related to a problem? Please describe.
We would like to further reduce the likelihood of rebuffering and increase buffer health by tweaking the playback rate of the video.
Describe the solution you'd like
This involves 3 changes that are all related.
- For VOD
streaming.vodDynamicPlaybackRate: when enabled, begin playback at a low playback rate (0.95x, configurable) and when the buffer is high, increase rate to 1x, if the buffer is low, decrease back to 0.95x.
- For live
streaming.liveSyncPanicMode: if enabled, When the player rebuffers, enter "panic" mode, which sets the player to theliveSyncMinPlaybackRatefor a specified duration, say 60s by default.streaming.liveSyncDynamicTargetLatency: if enabled, when the playback is progressing smoothly, move the target latency closer to the min latency, and if playback is having issues move it back towards the max latency.
Describe alternatives you've considered
It's possible to introduce other ABR algorithms, but this gives us another tool to maintain buffer health for both live and vod content and help reduce rebuffering for users.
Additional context
The first two features, dynamic playback rate for vod and panic mode for live sync, can both be implemented as extensions on top of what's currently there. Though, if there are pointers on how to approach this that would fit the codebase better, that would be great!
For example, for the panic mode, we'd need to store when the last rebuffering event happened so that we can check against it in the onTimeUpate_ method in player.js, where should that var be stored? And for the vod dynamic playback rate, should the play rate controller own this functionality?
The third feature, dynamic target latency, is a bit trickier. Currently, live sync is set up by looking at the min and max latencies (either configured or received via DASH ServiceDescriptions) and then playback rate is set up based on that. However, for this feature, we'd need to have a third value, target latency -- which the DASH LL Spec does define, actually -- but switching from a min/max latency to a target latency would potentially be a breaking change or would potentially duplicate a lot of code (since we'd want to fork the onTimeUpdate_ method depending on whether dynamic target latency is enabled or not).
While, the DASH spec, technically, says that the target latency is the only required one, I'm not sure if it's necessarily worth migrating to, given the risk just outlined. However, if y'all have thoughts on how to do that or any other alternatives, it would be nice as this feature can help reduce rebufferings.