logo

How to start with a specific quality?

This question is typically asked because developers want their HLS or MPEG-DASH stream to start with a specific rendition of the manifest. They want to implement this use-case to speed-up the time-to-first frame, or to serve a better quality to the customer, or to serve a different quality on different platforms.

Table of Contents

SDKs

Web SDK Android SDK iOS SDK tvOS SDK Android TV SDK Chromecast SDK
Yes Yes No No Yes N/A

Code examples

Web SDK
var player = new THEOplayer.Player(element, playerConfig);
player.videoTracks.addEventListener('addtrack', function(e0) {
    player.videoTracks[0].targetQuality = player.videoTracks[0].qualities[0]; // start with a specific quality
    player.addEventListener('progress', attachABRResetLogic);
});

function attachABRResetLogic() {
    if (player.buffered.length > 0) {
        // switch to normal ABR when THEO buffered beyond 10 seconds
        if (player.buffered.end(player.buffered.length - 1) > 10) {
            player.videoTracks[0].targetQuality = null;
            player.removeEventListener('progress', attachABRResetLogic);
        }
    }
}

player.source = {
    sources : [{
        src : '//cdn.theoplayer.com/video/star_wars_episode_vii-the_force_awakens_official_comic-con_2015_reel_(2015)/index.m3u8'
    }],
};

Use the targetQuality property to pass on an array of qualities. THEOplayer will only be able to render qualities belonging to this array through its ABR algorithm. Viewers can still select the quality through the quality selector.

When the addtrack event is dispatched, THEOplayer has not yet started buffered, so you can adjust the targetQuality. The targetQuality property allows you to specify a set of qualities on which THEOplayer can use for ABR-selection. THEOplayer will have to select the set quality if only one quality is provided. You reset the ABR-selection by setting targetQuality to null.

Android SDK
private Player theoplayer;
private TimeRanges buffered;

theoplayer.getVideoTracks().addEventListener(VideoTrackListEventTypes.ADDTRACK, new EventListener<AddTrackEvent>() {
    @Override
    public void handleEvent(AddTrackEvent addTrackEvent) {
        theoplayer.getVideoTracks().getItem(0).setTargetQuality(theoplayer.getVideoTracks().getItem(0).getQualities().getItem(0));
        theoplayer.addEventListener(PlayerEventTypes.PROGRESS, new EventListener<ProgressEvent>() {
            @Override
            public void handleEvent(ProgressEvent progressEvent) {
                attachABRResetLogic();
            }
        });
    }
});
private void attachABRResetLogic() {
    theoplayer.requestBuffered(result -> buffered = result);
    if (buffered.length() > 0){
        //Switch to normal ABR when THEO buffered beyond 10 seconds
        if (buffered.getEnd(buffered.length() - 1) > 10) {
            theoplayer.getVideoTracks().getItem(0).setTargetQuality(null);
            theoplayer.removeEventListener(PlayerEventTypes.PROGRESS, new EventListener<ProgressEvent>() {
                @Override
                public void handleEvent(ProgressEvent progressEvent) {
                    attachABRResetLogic();
                }
            });
        }
    }
}

Remarks

  • This is not possible with the iOS due to the fact that playback control on this platform is very limited.

Resources

github
Make sure to follow us on GitHub!
THEO-logo-white
twitter
facebook
linkedin
Copyright © 2020. All Rights Reserved.
Leuven
New York
Singapore
Barcelona