Low Bandwidth

Our servers can detect when a subscriber is on a low-bandwidth connection and will automatically adjust the video quality to ensure smooth playback. However, sometimes even reduced quality may not be enough for a good experience, and the system may decide to pause some or all incoming video streams for the local user.

When this happens, affected participants will show an avatar placeholder instead of their video feed, with a video-off indicator.

Low bandwidth

Low Bandwidth Optimization Toggling

The Low Bandwidth optimization is enabled by default at the SDK level. However, you can opt out of this feature if needed:

import stream.video.sfu.models.ClientCapability

val call = client.call(type, id)
call.disableClientCapabilities(
    listOf(ClientCapability.CLIENT_CAPABILITY_SUBSCRIBER_VIDEO_PAUSE)
)

// Use call.enableClientCapabilities(...) to re-enable the feature

call.join()

This signals to the backend that the client supports dynamic video pausing, allowing the system to optimize media delivery under limited network conditions.

Observing Paused Tracks

When the feature is active, the backend may pause some remote video tracks. You can observe which participants have paused video through the video.paused property:

@Composable
fun ParticipantsWithPausedVideo(call: Call) {
    val participants by call.state.participants.collectAsStateWithLifecycle()

    val participantsWithPausedVideo = participants.filter { participant ->
        participant.video.value?.paused == true
    }

    if (participantsWithPausedVideo.isNotEmpty()) {
        // Show notification that some participants have paused video
        PausedVideoNotification()
    }

    // Your call layout UI
    CallContent(call = call)
}

This can be used to update the UI, for example by displaying a message that some participants have their video paused due to bandwidth constraints.