Rate this page:

Video quality management

In Voximplant video conferences, there are two ways to manage video quality. One is automatically disabling incoming video streams for users with poor internet connection, the other is Simulcast, which adapts the incoming video stream for each conference participant so everyone can have the best experience.

Contents

Copy URL

Automatic video stream disabling

Copy URL
Inbound/outgoing video streams

This article is related to web and mobile SDKs. Outbound video stream means video from the camera sent from a client to the server. Inbound video streams mean video from other conference participants sent from the server to a client.

If a conference participant experiences issues with the internet connection and cannot receive video streams because of network reasons, the Voximplant cloud detects it and stops sending video streams to the client automatically. When the participant's internet connection becomes better, the Voximplant cloud resumes sending video streams.

If simulcast is enabled, first the server tries to send lower-quality video streams to the participant with a poor internet connection. If this is not enough and the participant cannot receive all video streams, the server disables incoming video streams one by one. It can disable one or several video streams depending on the participant's internet connection.

If simulcast is disabled, video quality does not change and the server starts disabling incoming video streams if the participant's bandwidth is not enough to receive them all.

The priority for disabling video streams is based on participants' activity. First, the server disables less active participants, who have not spoken longer than others. When the connection improves, the server resumes the most active participants first. The Voximplant cloud does not disable the screen sharing video stream in case of poor internet connection.

To process this behavior, you need to subscribe to the corresponding video stream events. They differ depending on your SDK.

Note

If a user starts or stops sending video manually in their application, other conference participants do not receive these events.

After you subscribe to the events, you need to process the reason parameter, which explains the reason for disabling the incoming video stream. It can have one of the following values:

  • Manual — incoming video stream is disabled manually by the user (for example, via MediaRenderer.disable() in Web SDK, VIRemoteVideoStream.stopReceiving() in iOS SDK, or IRemoteVideoStream.stopReceiving() in Android SDK)

  • Automatic — incoming video stream is disabled by the Voximplant cloud because of poor network connection

You can process these events as you desire. The most common way is to hide the incoming video (to avoid freezing the image) and show a network issue icon instead of the incoming video. The Voximplant cloud does not disable the audio stream.

Hint

If participant A stopped receiving video from participant B due to poor internet connection and received the network issue icon, and then participant B stopped sending the video on their side, we recommend hiding the network issue icon for participant A.

Here are examples for multiple SDKs of how to process these events:

Processing video stream disabling

Processing video stream disabling

Adaptation to devices and connections

Copy URL

Different conference members have different hardware and internet connection resources, and this is the main reason people face bad video performance in video conferences.

If we send high-quality video streams to users with poor internet connection or hardware, it causes image and sound to freeze and cause bad performance.

But if we send low-quality video to everyone, users with poor internet connection or hardware do not experience issues, but people with good internet connection and hardware will not be satisfied with the image quality.

Sender-side optimization

For web cameras, we manage video quality by changing video resolution. The higher the user's resolution, the more video layers the user sends. Then, we send good-quality video to everyone who can receive it and low-quality video to users with a poor internet connection or slow hardware.

For screen sharing, this approach is wrong, because users can share small text and even source code, and lowering resolution can cause the text to be pixelated and unreadable. That is why for screen sharing we manage video quality by lowering frames per second.

Recipient-side optimization

In addition to sender-side optimization, recipients also lower incoming traffic via:

  • requesting a video stream that is not bigger than a video window on the device

  • disabling the incoming video streams for those participants that are not currently visible

Web SDK API

Here you can find instructions on Web SDK, which are useful for building a web application.

You can connect to a conference with quality management:

Connect to a conference with quality management

Connect to a conference with quality management

And enable/disable video stream and request its status:

Enable/disable incoming video

Enable/disable incoming video

You can request a custom resolution from a server and retrieve the last requested resolution:

Request a custom resolution

Request a custom resolution

Here is how you can subscribe to the following events:

  • a user starts/stops talking

  • a user's video stream enables/disables

Subscribe to events

Subscribe to events

VoxEngine scenario

Here you can find instructions on the VoxEngine scenario to enable video quality management on the Voximplant side.

Here is how you add and remove a user (or endpoint) to and from a conversation:

Add and remove an endpoint

Add and remove an endpoint

You can get the connected endpoints list, get an endpoint by its ID, and get the endpoint's call, conference, mode, streams, and their directions:

Manage endpoints and their data

Manage endpoints and their data

You can manage streams: enable or disable them, or request all streams with specific directions:

Manage streams

Manage streams

You can request a specific resolution for a stream:

Request a specific resolution

Request a specific resolution

You can also process the following events:

  • an endpoint is added/removed

  • an endpoint's incoming stream is added/removed/changed

  • an endpoint's outgoing stream is added/removed/changed/enabled/disabled

  • an endpoint's outgoing stream's max resolution is changed

Subscribe to events

Subscribe to events