DocumentationBlogSupport
Log inSign up
Log inSign up
BlogSupport
Build
Getting StartedPlatform Introduction
Embedded Apps
What's NewOverviewDeveloper GuideSidebar API Quick StartSubmission Checklist for Embedded Apps
Design Guidelines
MessagingMeetingsDevicesSidebarSidebar on Mobile
API Reference
BotsButtons and CardsIntegrationsBYODSService AppsService App GuestsService Apps G2GGuest IssuerWidgetsWebex ConnectLogin with WebexInstant ConnectInstant Connect Meeting LinksDeveloper SandboxBeta ProgramSubmit Your AppSupport PolicyFAQs
APIs
API Behavior ChangesPartners API GuideXML API DeprecationAccess the APIREST API BasicsCompliance
Webex APIs
Reference
Data Sources
Admin
OverviewAdmin APIsHybrid ServicesAuthentication
Guides
Hybrid ServicesWebhooksReal-time File DLP BasicsProvisioning APIsBackground ImagesAudit Events Error Reference
Reference
Admin Audit EventsAuthorizationsEventsGroupsHistorical AnalyticsHybrid ClustersHybrid ConnectorsLicensesMeeting QualitiesOrganization ContactsOrganizationsPartner ManagementPartner Reports/TemplatesPartner TagsPeopleRecording ReportRecordingsReport TemplatesReportsResource Group MembershipsResource GroupsRolesSecurity Audit EventsSession TypesSettingsSpace ClassificationsTracking CodesWorkspace LocationsWorkspace Metrics
Webex Calling Beta
Overview
Guides
Integrations and AuthorizationMetadata and Samples
Webex Calling
OverviewSDKs and ToolsWhat's New
Guides
Integrations and AuthorizationProvisioning APIsMetadata and SamplesBackground Images
Reference
Call ControlsCall RoutingCall Settings For MeCalling Service SettingsClient Call SettingsConference ControlsConverged RecordingsDECT Devices SettingsDevice Call SettingsDevicesEmergency Services SettingsFeatures: Announcement PlaylistFeatures: Announcement RepositoryFeatures: Auto AttendantFeatures: Call ParkFeatures: Call PickupFeatures: Call QueueFeatures: Call RecordingFeatures: Customer Experience EssentialsFeatures: Hunt GroupFeatures: Operating ModesFeatures: Paging GroupFeatures: Single Number ReachLocation Call SettingsLocation Call Settings: Call HandlingLocation Call Settings: SchedulesLocation Call Settings: VoicemailLocationsNumbersPSTNPartner Reports/TemplatesPeopleRecording ReportReportsReports: Detailed Call HistorySend Activation EmailUser Call SettingsVirtual Line Call SettingsWorkspace Call SettingsWorkspaces
Webex for Broadworks
Overview
Guides
Integrations and AuthorizationDeveloper's Guide
Reference
BroadWorks Billing ReportsBroadWorks EnterprisesBroadWorks SubscribersBroadWorks Workspaces
Webex for Wholesale
Overview
Guides
Developer's Guide
Reference
Wholesale Billing ReportsWholesale Provisioning
Webex for UCM
Guides
Integrations and Authorization
Reference
UCM Profile
Contact Center
Overview
Reference
Data Sources
Customer Journey Data
Overview
Guides
Getting StartedFAQ
Devices
Overview
Guides
Devices
Reference
Device Call SettingsDevice ConfigurationsDevicesWorkspace LocationsWorkspace MetricsWorkspace PersonalizationWorkspacesxAPI
Directory Services
Reference
Domain ManagementIdentity Organization
Meetings
Overview
Guides
Integrations and AuthorizationWebhooksWebinar GuideMeeting Resource Guide
Reference
Meeting ChatsMeeting Closed CaptionsMeeting InviteesMeeting MessagesMeeting ParticipantsMeeting PollsMeeting PreferencesMeeting Q and AMeeting QualitiesMeeting TranscriptsMeetingsMeetings Summary ReportPeopleRecording ReportRecordingsSession TypesTracking CodesVideo MeshWebhooks
Messaging
Overview
Guides
BotsIntegrations and AuthorizationWebhooksButtons and Cards
Reference
Attachment ActionsEventsMembershipsMessagesPeopleRoom TabsRoomsTeam MembershipsTeamsWebhooks
SCIM 2
Overview
Reference
SCIM 2 BulkSCIM 2 GroupsSCIM 2 Users
Workspace Integrations
OverviewTechnical DetailsControl Hub Features
Webex Status API
Full API Reference
Admin Audit EventsAttachment ActionsAuthorizationsBroadWorks Billing ReportsBroadWorks EnterprisesBroadWorks SubscribersBroadWorks WorkspacesCall ControlsCall RoutingCall Settings For MeCalling Service SettingsClient Call SettingsConference ControlsConverged RecordingsDECT Devices SettingsData SourcesDevice Call SettingsDevice ConfigurationsDevicesDomain ManagementEmergency Services SettingsEventsFeatures: Announcement PlaylistFeatures: Announcement RepositoryFeatures: Auto AttendantFeatures: Call ParkFeatures: Call PickupFeatures: Call QueueFeatures: Call RecordingFeatures: Customer Experience EssentialsFeatures: Hunt GroupFeatures: Operating ModesFeatures: Paging GroupFeatures: Single Number ReachGroupsGuests ManagementHistorical AnalyticsHybrid ClustersHybrid ConnectorsIdentity OrganizationIssuesLicensesLocation Call SettingsLocation Call Settings: Call HandlingLocation Call Settings: SchedulesLocation Call Settings: VoicemailLocationsMeeting ChatsMeeting Closed CaptionsMeeting InviteesMeeting MessagesMeeting ParticipantsMeeting PollsMeeting PreferencesMeeting Q and AMeeting QualitiesMeeting TranscriptsMeetingsMeetings Summary ReportMembershipsMessagesNumbersOrganization ContactsOrganizationsPSTNPartner ManagementPartner Reports/TemplatesPartner TagsPeopleRecording ReportRecordingsReport TemplatesReportsReports: Detailed Call HistoryResource Group MembershipsResource GroupsRolesRoom TabsRoomsSCIM 2 BulkSCIM 2 GroupsSCIM 2 UsersSecurity Audit EventsSend Activation EmailSession TypesSettingsSiteSpace ClassificationsTeam MembershipsTeamsTracking CodesUCM ProfileUser Call SettingsVideo MeshVirtual Line Call SettingsWebhooksWholesale Billing ReportsWholesale ProvisioningWorkspace Call SettingsWorkspace LocationsWorkspace MetricsWorkspace PersonalizationWorkspacesxAPI
API Changelog
SDKs
Space Meetings Migration
Calling
Introduction
Platform
Web
IntroductionQuickstart
Basics
AuthorizationCore ConceptsCalls
Advanced Features
Call SettingsContactsSupplementary ServicesVoicemailBackground Noise Reduction
Kitchen Sink
Meetings
Introduction
Platform
Web
IntroductionQuickstart
Basics
AuthorizationJoin a MeetingMigration To Improved MeetingsPasswords & CaptchasUnified Space Meetings
Advanced Features
Advanced ControlsDialing In and OutStreams & EffectsVideo Resolution
Multistream
Multistream Comprehensive GuideMultistream Quickstart
Migrating SDK V2 to V3
iOSAndroidBrowserNode.jsClick to Call
Developer CommunityCertifications

SDKs

Web Meetings SDK | Multistream Comprehensive Guide

Developers have a variety of options to customize how they choose to display remote videos with multistream media.

The initial step in utilizing Multistream is to include enableMultistream within the joinOptions parameter for both the meeting.join() and meeting.joinWithMedia() methods.

Example

const joinOptions = {
  enableMultistream: true,
  ...
};

await meeting.join(joinOptions);

// or

await meeting.joinWithMedia({joinOptions, mediaOptions});

This article is divided into three sections:

  1. Layouts: Determines the preferred visualization of the remote streams.
  2. Events: Monitors all remote streams and additional events.
  3. Methods and RemoteMediaManager: Facilitates layout updates and other operations.

Terminology

Throughout this document we'll refer to the following terms:

  • Layout: An arrangement of remote streams in the user interface.
  • Pane: An individual element within the layout grid.
  • Remote Media: The media stream and associated details.
  • Remote Media Group: A collection of remote media as a group, along with additional helper APIs.
  • CSI: A unique identifier linked to a stream, connecting a member participant with that stream.

anchorLayout

anchor

A "layout" refers to the arrangement of remote streams in the user interface. Multistream allows you to customize this layout. To do so, call addMedia() with the desired layout details. The existing arguments for addMedia() are unaffected by this process. For more information, refer to this documentation.

The AddMediaOptions now includes a new property, remoteMediaManagerConfig, for multistream functionality. To implement a custom layout, you can use the same data format as shown in the predefined layouts.

The following are the default configuration values for remoteMediaManagerConfig, which are used if no overrides are provided:

const remoteMediaManagerConfig = {
  audio: {
    numOfActiveSpeakerStreams: 3,
    numOfScreenShareStreams: 1,
  },
  video: {
    preferLiveVideo: true,
    initialLayoutId: 'AllEqual',

    layouts: {
      AllEqual: AllEqualLayout,
      OnePlusFive: OnePlusFiveLayout,
      Single: SingleLayout,
      Stage: Stage2x2With6ThumbnailsLayout,
      ScreenShareView: RemoteScreenShareWithSmallThumbnailsLayout,
    }
  }
}

A detailed explanation of this object can be found here.

Here are the predefined layouts for the default configuration:

TypeDescription
AllEqualAll equal (max 9).
OnePlusFiveOne big pane + five small.
SingleSingle Video pane.
StageStage with thumbnails.
ScreenShareViewScreen share with thumbnails.
Layout Details

The following setions describe each available layout in detail.

AllEqual

An "all equal" grid, with size up to 3 x 3 = 9.

All equal grid

Example

const AllEqualLayout: VideoLayout = {
  activeSpeakerVideoPaneGroups: [
    {
      id: 'main',
      numPanes: 9,
      size: 'best',
      priority: 255,
    },
  ],
};
OnePlusFive

A layout with one big pane for the highest-priority active speaker and 5 small panes for other active speakers.

One plus 5 layout

Example

const OnePlusFiveLayout: VideoLayout = {
  activeSpeakerVideoPaneGroups: [
    {
      id: 'mainBigOne',
      numPanes: 1,
      size: 'large',
      priority: 255,
    },
    {
      id: 'secondarySetOfSmallPanes',
      numPanes: 5,
      size: 'very small',
      priority: 254,
    },
  ],
};
Single

A layout with a single remote active speaker video pane.

Single remote speaker video pane

Example

const SingleLayout: VideoLayout = {
  activeSpeakerVideoPaneGroups: [
    {
      id: 'main',
      numPanes: 1,
      size: 'best',
      priority: 255,
    },
  ],
};
Stage

A staged layout with four pre-selected meeting participants in the main 2x2 grid and 6 small panes for other active speakers at the top.

The predetermined participants can be included using the CSI value, which can be updated once the values are accessible after joining the meeting.

Staged layout

Example

const Stage2x2With6ThumbnailsLayout: VideoLayout = {
  activeSpeakerVideoPaneGroups: [
    {
      id: 'thumbnails',
      numPanes: 6,
      size: 'thumbnail',
      priority: 255,
    },
  ],
  memberVideoPanes: [
    {id: 'stage-1', size: 'medium', csi: undefined},
    {id: 'stage-2', size: 'medium', csi: undefined},
    {id: 'stage-3', size: 'medium', csi: undefined},
    {id: 'stage-4', size: 'medium', csi: undefined},
  ],
};
ScreenShareView

A strip of eight small video panes (thumbnails) displayed at the top of a remote screenshare.

Eight small video panes

Example

const RemoteScreenShareWithSmallThumbnailsLayout: VideoLayout = {
  screenShareVideo: {size: 'best'},
  activeSpeakerVideoPaneGroups: [
    {
      id: 'thumbnails',
      numPanes: 8,
      size: 'thumbnail',
      priority: 255,
    },
  ],
};
RemoteMediaManager Configuration Object

This object configures the RemoteMediaManager. Based on this configuration, you will receive the multistream remote media.

{
  audio: {
    numOfActiveSpeakerStreams: number; 
    numOfScreenShareStreams: number; 
  };
  video: {
    preferLiveVideo: boolean; 
    initialLayoutId: LayoutId;

    layouts: {[key: LayoutId]: VideoLayout}; 
  };
}
Properties of the Audio Object

NameDescriptionType
numOfActiveSpeakerStreamsThe maximum number of speakers that can be heard simultaneously.Number
numOfScreenShareStreamsThe maximum number of screenshare streams. Typically, one should suffice as only one person can present at a time in Webex.Number
Properties of Video Object

NameDescriptionType
preferLiveVideoIf set to true, the server prioritizes sending streams of participants with their video enabled over those that don't send video.boolean
initialLayoutIdOne of the keys defined within the layouts object.string
layoutsKey-value pairs where the value determines the layout. Additional details are provided in the following table.object
Properties of VideoLayout Object

NameDescriptionType
screenShareVideoDefines the screenshare stream.{ size: PaneSize }
activeSpeakerVideoPaneGroupsDefines the active speaker panes.Array<ActiveSpeakerPaneObject>
memberVideoPanesDefines the member video panes.Array<MemberPaneObject>
Values for the PaneSize Object

PaneSizeDescription
thumbnailThe smallest possible resolution, 90p or less.
very small180p or less.
small360p or less.
medium720p or less.
large1080p or less.
bestHighest possible resolution.
Properties of ActiveSpeakerPaneObject

NameDescriptionType
idAn arbitrary value.string
numPanesThe number of streams that you will receive.number
sizeThe size of each stream.PaneSize (string)
priorityThe priority of the streams. The most recent active speaker has the highest priority.number (0-255)

Consider the following scenario with two groups:

  • Group A: Priority 255, contains 1 video pane
  • Group B: Priority 254, contains 5 video panes In a meeting with 6 attendees, when person X begins speaking, they appear in Group A. If person Z starts speaking next, Z will be displayed in Group A, and X will move to Group B.
Properties of MemberPaneObject

NameDescriptionType
idAn arbitrary value (e.g., stage-1).string
sizeThe size of the stream.PaneSize (string)
csiA unique identifier for a stream. When a client generates a stream, it assigns a CSI value to it.number

Member video panes can only be accessed within the stage layout, which allows for the pinning of specific participants' positions in the layout. The stage layout is created when memberVideoPanes is included in the layout configuration. In this case, developers are responsible for managing and displaying participants as they join or leave. This is different from activeSpeakerVideoPaneGroups, where a consistent list of streams featuring active speakers/participants is always received. Additionally, the active speaker video pane can be pinned. Therefore, participants can be pinned either by using memberVideoPanes or by invoking pinActiveSpeakerVideoPane(remoteMedia, csi) for activeSpeakerVideoPaneGroups.

Each member or participant can have multiple streams. These streams can be of various types such as audio, video, screenshareVideo, or screenshareAudio. Each stream is uniquely identified by a CSI. A member can have more than one stream of the same type. For instance, a user can have two video streams (each with a unique CSI) if they join the meeting using multiple devices.

In most scenarios, you'll primarily utilize activeSpeakerVideoPaneGroups.

anchorEvents

anchor

Events can be listened to using the meeting.on() method.

Here's an example:

meeting.on('event name', (data) => {
  console.log(data);
});

When multistream is enabled, media cannot be accessed or listened to on the media:ready event. Instead, you should listen to the media events received during a meeting that pertain to multistream, such as the events mentioned below, to handle media streams appropriately.

meeting.on('media:remoteVideo:layoutChanged', ({
  layoutId, activeSpeakerVideoPanes, memberVideoPanes, screenShareVideo
}) => {
  console.log('layoutId: ', layoutId);
  console.log('activeSpeakerVideoPanes:', activeSpeakerVideoPanes);
  console.log('memberVideoPanes:', memberVideoPanes);
  console.log('screenShareVideo:', screenShareVideo);
});

The event media:remoteVideo:layoutChanged will be triggered with the initialLayoutId the first time, even if there are no changes in the layout.

Media Events

The following table and sections elaborate on the media events received during a meeting that pertain to multistream.

Event nameData Received
media:remoteAudio:createdList of audio streams (remains unchanged by layout changes).
media:remoteScreenShareAudio:createdObject representing the screen share audio media group.
media:remoteVideo:layoutChanged{ layoutId, activeSpeakerVideoPanes, memberVideoPanes, screenShareVideo }.
media:remoteVideoSourceCountChangedNumber of remote video sources ({ numTotalSource, numLiveSources }).
media:remoteAudioSourceCountChangedNumber of remote audio sources ({ numTotalSource, numLiveSources }).
media:activeSpeakerChangedList of member IDs for active speakers ({ memberIds }).

The list of audio streams received in the media:remoteAudio:created event does not contain participant ID information. It is also not possible to correlate a single audio stream with the participant that is speaking.

media:remoteScreenShareAudio:created

To obtain the list of remote media elements from the group, invoke getRemoteMedia().

const remoteMedia = screenShareAudioMediaGroup.getRemoteMedia()[0];
const remoteMediaStream = remoteMedia.stream;

Asynchronous: No

Parameters

NameDescriptionTypeMandatory
filterA string used to filter and retrieve a specific type of remote media.all (Default), pinned, unpinnedNo

Returns: Array<RemoteMedia>

media:remoteVideo:layoutChanged

Data ReceivedDescription
layoutIdOptions: AllEqual, OnePlusFive, Single, Stage, ScreenShareView
activeSpeakerVideoPanesContains: groupId, groupRemoteMedia
memberVideoPanesContains: paneId, remoteMedia
screenShareVideoRemoteMedia object: { id, stream, sourceState (either 'no source' or 'live'), memberId }

The layoutId list displayed here corresponds to those defined in the configuration. These IDs may vary depending on your configuration settings.

media:remoteVideoSourceCountChanged

Data ReceivedDescription
numTotalSourceTotal number of all video sources.
numLiveSourcesTotal number of live video sources.
media:remoteAudioSourceCountChanged

Data ReceivedDescription
numTotalSourceTotal number of all audio sources.
numLiveSourcesTotal number of live audio sources.
Meeting Events

The following table and sections elaborate on the meeting events received during a meeting that pertain to multistream.

Event nameDescription
meeting:stoppedSharingLocalThe client has stopped screen sharing and no longer has control over it. This can occur when another participant starts sharing and takes control, or if the user stops sharing.
meeting:startedSharingRemoteAnother participant in the meeting has started screen sharing and now has control over it.
meeting:stoppedSharingRemoteAnother participant in the meeting has stopped screen sharing and no longer has control over it.
Remote Media Events

The remoteMedia object may include streams from various participants and can dynamically update as different participants begin speaking. The memberId within the remoteMedia object allows for the display of corresponding names or data alongside the stream. This memberId can be utilized to retrieve the name of the participant.

Events can be listened to using the remoteMedia.on() method.

Example

remoteMedia.on('Event name', (data) => {
  console.log(data);
});

Event nameDescription
sourceUpdateTriggered when the source of the remoteMedia changes, such as when another participant begins speaking.
stoppedTriggered when the participant has deactivated their stream.

With sourceUpdate, you can inspect the memberId and sourceState to obtain the most recent information about the remoteMedia.

Here's the possible information received during the sourceUpdate event:

Data ReceivedDescription
no sourceNo video is available.
invalid sourceThe source is invalid.
liveThe video is available.
avatarThe camera is muted or there is no video. An avatar can be shown.
bandwidth disabledThere is insufficient bandwidth to show the video. An avatar can be shown.
policy violationVideo is restricted due to a policy violation.

anchorMethods

anchor

Multiple methods are available for handling various scenarios and updating the layout.

Get an Array of a Member's CSIs
const csiList = meeting.members.getCsisForMember(memberId, mediaType='video', mediaContent='main');

Asynchronous: No

Parameters

NameDescriptionTypeMandatory
memberIdMember's ID.stringYes
mediaTypeThe media type.audio, video (Default)No
mediaContentType of media content.main (Default), slidesNo

Returns: Array<number>

Find A Member by CSI
const member = meeting.members.findMemberByCsi(csi);

Asynchronous: No

Parameters:

NameDescriptionTypeMandatory
csiCSI number linked to the stream.numberYes

Returns: Member

anchorRemote Media Manager

anchor

In multistream meetings, the meeting.addMedia() API establishes the media connection. It configures streams to receive remote media based on the remoteMediaManagerConfig provided as an option.

The Meeting.addMedia() method accepts an optional configuration object to set up the RemoteMediaManager:

meeting.addMedia({
  ...,
  remoteMediaManagerConfig?: RemoteMediaManagerConfiguration;
})

RemoteMediaManager configuration object

{
  audio: {
    numOfActiveSpeakerStreams: number; // number of audio streams we want to receive
    numOfScreenShareStreams: number; // 1 should be enough because in Webex only 1 person at a time can be presenting screen share
  };
  video: {
    preferLiveVideo: boolean; // applies to all pane groups with active speaker policy
    initialLayoutId: LayoutId;

    layouts: {[key: LayoutId]: VideoLayout}; // a map of all available layouts, a layout can be set via setLayout() method
  };
}

This object's details are outlined in the Explanation of the RemoteMediaManager Object section.

Set a Remote Video CSI
meeting.remoteMediaManager.setRemoteVideoCsi(remoteMedia, csi);

Asynchronous: No

Parameters:

NameDescriptionTypeMandatory
remoteMediaRemoteMedia object.RemoteMediaYes
csiA new CSI value, can be null if we want to stop receiving media.number, nullYes

Returns: void

Add a Member Video Pane
const remoteMedia = await meeting.remoteMediaManager.addMemberVideoPane(
  { id: PaneId; size: PaneSize; csi?: CSI; }
);

Asynchronous: Yes

Parameters:

NameDescriptionTypeMandatory
idPane ID.stringYes
sizeSize of the video pane.thumbnail, very small, small, medium, large, bestYes
csiCSI number associated with the stream.numberNo

Returns: Promise<RemoteMedia>

Get the Currently Selected Layout ID
const layoutId = meeting.remoteMediaManager?.getLayoutId();

Asynchronous: No

Parameters: No

Returns: string

Change the Layout

Calling this method triggers the media:remoteVideo:layoutChanged event.

await meeting.remoteMediaManager.setLayout(layoutId);

Asynchronous: Yes

Parameters:

NameDescriptionTypeMandatory
layoutIdID of the defined layout.stringYes

Returns: Promise<void>

Set the prefer live video
meeting.remoteMediaManager.setPreferLiveVideo(preferLiveVideo);

Asynchronous: No

Parameters:

NameDescriptionTypeMandatory
preferLiveVideoIf enabled, this option will prioritize retrieving streams with active video.booleanYes

Returns - void

Set Active Speaker CSIs

Set CSIs for multiple RemoteMedia instances belonging to a RemoteMediaGroup.

meeting.remoteMediaManager.setActiveSpeakerCsis(remoteMediaCsis);

Asynchronous: No

Parameters: An array of object with the following properties, for example, Array<{ remoteMedia, csi }>.

NameDescriptionTypeMandatory
remoteMediaThe remote media object.RemoteMediaYes
csiCSI number associated with the stream.numberNo

Returns: void

For each entry in the remoteMediaCsis array:

  • If csi is specified, the RemoteMedia instance is pinned to that CSI.
  • If csi is undefined, the RemoteMedia instance gets unpinned.
Set a Remote Video CSI

Set a new CSI on a given remote media object

meeting.remoteMediaManager.setRemoteVideoCsi(remoteMedia, csi);

Asynchronous: No

Parameters:

NameDescriptionTypeMandatory
remoteMediaThe remote media object to be altered.RemoteMediaYes
csiA new CSI value. It can be null if you wish to stop receiving media.number, nullYes

Returns - void

Add a Member Video Pane

Add a new member video pane to the currently selected layout.

const remoteMedia = await meeting.remoteMediaManager.addMemberVideoPane(newPane);

Asynchronous: Yes

Parameters:

NameDescriptionTypeMandatory
idPane ID.stringYes
sizePane size.thumbnail, very small, small, medium, large, bestYes
csiNew CSI value.numberNo

Returns - Promise<RemoteMedia>

Changes to the layout are lost after a layout change.

Remove Member Video Pane

Remove a member video pane from the currently selected layout.

await meeting.remoteMediaManager.removeMemberVideoPane(paneId);

Asynchronous: Yes

Parameters:

NameDescriptionTypeMandatory
paneIdPane ID.stringYes

Returns - Promise<void>

Changes to the layout are lost after a layout change.

Pin an Active Speaker Video Pane

Pin an active speaker remote media object to the given CSI value.

meeting.remoteMediaManager.pinActiveSpeakerVideoPane(remoteMedia, csi);

This function pins an active speaker's remote media object to a specified CSI value. Consequently, the remote media will only play audio/video from that specific CSI. This remains in effect until either the unpinActiveSpeakerVideoPane() function is called or the current layout is altered.

Asynchronous: No

Parameters:

NameDescriptionTypeMandatory
remoteMediaReference to the remote media object.RemoteMediaYes
csiCSI value to pin to. If undefined, the current CSI value is used.numberNo

Returns - void

Unpin Active Speaker Video Pane

Unpin a remote media object from the specific CSI value to which it was previously pinned.

meeting.remoteMediaManager.unpinActiveSpeakerVideoPane(remoteMedia);

Asynchronous: No

Parameters:

NameDescriptionTypeMandatory
remoteMediaRemote media object reference.RemoteMediaYes

Returns - void

Pinned

Determine whether a given remote media object is part of an active speaker group and if it has been pinned.

const isPinned = meeting.remoteMediaManager.isPinned(remoteMedia);

Asynchronous: No

Parameters:

NameDescriptionTypeMandatory
remoteMediaRemote media object reference.RemoteMediaYes

Returns - boolean

Throws an error if the remote media object doesn't belong to any active speaker remote media group.

anchorSet Size Hint

anchor

Clients can specify a size hint if they are displaying remote video on screens of varying sizes and need to adjust the video resolution for optimal display or bandwidth conservation. When the remote receives this hint, it starts transmitting the video at the requested resolution.

setSizeHint() can be invoked on the remoteMedia object. Each video stream corresponds to a remoteMedia object.

remoteMedia.setSizeHint(width, height);

Asynchronous: No

Parameters:

NameDescriptionTypeMandatory
widthWidth of the video element.numberYes
heightHeight of the video element.numberYes

Returns - void

anchorBe Right Back

anchor

The meeting.beRightBack() allows the update of the "be right back" status for the current participant.

It can be used when a participant would like to step away from a meeting for a short period of time. When enabled, the participant's video stream could be replaced with a placeholder image, etc.

This method is applicable only to multistream meetings. It will throw an error if attempted in a non-multistream meeting.

await meeting.beRightBack(true);

Asynchronous: Yes

Parameters:

NameDescriptionTypeMandatory
enabledWhether or not be right back should be enabled.booleanYes

Returns: Promise<void>

anchorKitchen Sink App

anchor

To explore Multistream functionality, feel free to explore our Meeting Samples App.

Under Manage Meeting section, check the box with label Use a multistream connection before clicking on Join Meeting or Join with Media.

In This Article
  • Layout
  • Events
  • Methods
  • Remote Media Manager
  • Set Size Hint
  • Be Right Back
  • Kitchen Sink App

Connect

Support

Developer Community

Developer Events

Contact Sales

Handy Links

Webex Ambassadors

Webex App Hub

Resources

Open Source Bot Starter Kits

Download Webex

DevNet Learning Labs

Terms of Service

Privacy Policy

Cookie Policy

Trademarks

© 2025 Cisco and/or its affiliates. All rights reserved.