Skip to main content
View as Markdown

Player v7 Dual Screen Setup - Content Management

Player v7 Dual Screen Setup​

The Dual Screen plugin (@playkit-js/playkit-js-dual-screen) enables synchronized multi-stream playback in Kaltura Player v7 (PlayKit). It requires the kalturaCuepoints plugin if showing slides.

Enable via KMC Studio​

  1. Log in to KMC and go to the Studio tab
  2. Select the player you want to configure (or create a new one)
  3. Scroll to Engagement & Interactivity
  4. Toggle Dual screen on
  5. Configure the default layout:
    • Picture-in-Picture — primary video large, secondary as overlay (default)
    • Side-by-Side — both streams displayed equally
    • Single Media — only one stream visible at a time
  6. Set the PiP position (Top Right, Bottom Right, Top Left, Bottom Left)
  7. Click Save

Enable via JavaScript Config​

When using KalturaPlayer.setup(), add the dualscreen plugin to the config:

var config = {
targetId: 'player-container',
plugins: {
dualscreen: {
layout: 'PIP',
position: 'bottom-right',
childSizePercentage: 30,
childAspectRatio: { width: 16, height: 9 }
},
kalturaCuepoints: {} // Required if showing slides
}
};

var player = KalturaPlayer.setup(config);
player.loadMedia({ entryId: 'PARENT_ENTRY_ID' });

Plugin Configuration Options​

KeyTypeDefaultDescription
layoutstring"PIP"Initial layout mode (see layout modes below)
positionstring"bottom-right"PiP overlay position: "bottom-left", "bottom-right", "top-left", "top-right"
childSizePercentagenumber30Height of PiP child as percentage of parent player height
childAspectRatioobject{width: 16, height: 9}Aspect ratio of the PiP container
slidesPreloadEnabledbooleantruePreload slide images
removePlayerSettingsbooleanfalseHide media settings button when dual screen is active

These values define the initial appearance on load. Viewers can interactively change layout and position during playback.

Layout Modes​

LayoutDescription
PIPPrimary video large, secondary as small overlay
PIPInverseSecondary video large, primary as small overlay
SideBySideBoth streams side by side (primary on left)
SideBySideInverseBoth streams side by side (primary on right)
SingleMediaOnly primary video shown
SingleMediaInverseOnly secondary video shown
HiddenDual screen deactivated

Programmatic Control via JavaScript API​

The plugin registers a dualScreen service on the player instance:

var player = KalturaPlayer.setup(config);
player.loadMedia({ entryId: 'PARENT_ENTRY_ID' });

// Access the dual screen service
var dualScreenService = player.getService('dualScreen');

// Wait for secondary media to load
dualScreenService.ready.then(function() {
var activePlayer = dualScreenService.getActivePlayer();
var pipPlayer = dualScreenService.getPipPlayer();
var allPlayers = dualScreenService.getDualScreenPlayers();
});

Service methods:

MethodReturnsDescription
readyPromise<void>Resolves when secondary media is loaded
getActivePlayer()DualScreenPlayerThe player in the primary (large) container
getPipPlayer()DualScreenPlayerThe player in the PiP (small) container
getDualScreenPlayers(types?, container?)DualScreenPlayer[]All dual screen player instances
getDualScreenThumbs(time)thumbnail infoThumbnail data for both screens at a given time

Switch layout programmatically at runtime:

The plugin's initial config (layout, position) is set via KalturaPlayer.setup(). To switch layouts at runtime, access the plugin instance via player.plugins.dualscreen and call its internal _switchTo* methods after the dualScreen service is ready:

var dualScreenService = player.getService('dualScreen');

dualScreenService.ready.then(function() {
var ds = player.plugins.dualscreen;

// Switch to Side-by-Side
ds._switchToSideBySide({ force: true }, true);

// Switch to PiP
ds._switchToPIP({ force: true }, true);

// Switch to PiP with screens swapped (secondary becomes main)
ds._applyInverse();
ds._switchToPIP({ force: true }, true);

// Switch to Single Media (primary only)
ds._switchToSingleMedia({ force: true }, true);

// Hide dual screen entirely
ds._switchToHidden(true);
});

The first argument is { force: true } to ensure the switch happens even if the plugin thinks it's already in that layout. The second argument (true) marks it as a user interaction so the dualscreen_change_layout event fires.

For the Inverse variants (PIPInverse, SideBySideInverse, SingleMediaInverse), call ds._applyInverse() before the _switchTo* method to swap which stream is primary vs. secondary.

Events​

The plugin emits two custom events:

EventDescription
dualscreen_change_layoutFired when the layout changes (user interaction or programmatic)
dualscreen_side_displayedFired when a side/layout is rendered
player.addEventListener('dualscreen_change_layout', function(event) {
console.log('Layout changed to:', event.payload.layout);
});

See the Player Embed Guide for full embedding details.