Skip to content

Model seekable range for a MediaSource with finite duration #369

@eirikbjornr

Description

@eirikbjornr

To my understanding the aim of the HTMLMediaElement seekable property is to model the seekability of the current source.

The seekable attribute must return a new static normalized TimeRanges object that represents the ranges of the media resource, if any, that the user agent is able to seek to, at the time the attribute is evaluated.

In the context of MSE, seekable returns a time range from time zero to the MediaSource's duration if the duration is finite. Otherwise, if duration is Infinity, seekable returns the internal live seekable range property. (link: https://w3c.github.io/media-source/#htmlmediaelement-extensions-seekable)

There are cases where a finite duration does not mean time 0 is seekable. Sometimes a livestream is up for so long the start of the stream is no longer available when the stream ends. For example, our event streams (concerts etc.) sometimes overrun the 25H capacity we keep on or CDNs. To seek into that range would trigger a player error. Despite this, the seekable property always starts at 0 if the duration of the stream is finite (Section 10.1, step 3). Calling endOfStream() will result in a finite duration (see step 3 of the end of stream algorithm). Hence, it is not possible to model the availability of the livestream using the seekable property once the stream has ended. This leaves JS media player implementers with two choices:

  1. Ignore HTMLMediaElement's seekable property and implement their own seekability model.
  2. Ignore HTMLMediaElement's ended property and implement their own "ended" model.

All JS media players I've surveyed chose option 1 and implement their own seekability model (e.g., in dash.js).

Metadata

Metadata

Assignees

No one assigned

    Labels

    TPAC2025Agenda topic for TPAC 2025

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions