How Does Simulcast Let One Video Call Serve Every Viewer's Bandwidth?

TL;DR

  • Every viewer on a call has different bandwidth, so a single video encode always looks wrong for someone. Too heavy for one connection, too soft for another.
  • Simulcast has the sender encode the same camera feed at two or three qualities at once; the SFU forwards whichever layer each viewer's bandwidth and screen size call for, with no re-encoding on the server.
  • It costs the sender roughly 30-40% more upload and encoding work than a single top-quality stream. It's cheap because each lower layer has a fraction of the pixels.
  • It's distinct from SVC (one-layered encoding instead of separate streams), server-side transcoding (heavier and slower), and the other "simulcast," sending one encode to multiple platforms like Twitch or YouTube.

Video calls are presented as a single entity. Everyone on the call is sending video and receiving from everyone else (except those who always have their cameras off).

But under the hood, that's not true. Everyone on a video call is on a different connection. One person could be on a great fiber connection, another on home Wi-Fi, and a third on a train with a mobile signal that comes and goes.

If the sender produces a single encode, you have to choose which of those viewers gets a bad experience. A 720p stream at 1.5 Mbps stalls on the train, and a 300 kbps stream looks very bad for the person on fiber.

Simulcast is how WebRTC calls get around this. The sender encodes the same camera feed at several qualities simultaneously, and the server in the middle forwards to each viewer the version their connection can handle. Nothing gets re-encoded on the server, and the viewer never sees the switching happen.

What Does Simulcast Mean in a Video Call?

In a WebRTC call, simulcast means the sending device encodes its camera feed two or three times in parallel, at different resolutions and bitrates. It then uploads every one of those encodings to the call's Selective Forwarding Unit (SFU).

A typical three-layer setup looks like this:

Layer Example Typical use
Low 180p at around 150 kbps Thumbnails, or a viewer on a bad connection
Medium 360p at around 500 kbps The normal grid view
High 720p at around 1.5 Mbps Active speaker or full-screen view

Each layer is a separate, self-contained encode. The 360p stream doesn't depend on the 720p stream in any way, which is what lets the SFU hand any single layer to a viewer on its own. Most implementations also split each layer into temporal sub-layers, so the SFU can lower the frame rate within a layer, say from 30 fps to 15, without changing resolution.

The viewer never sees any of this. On the receiving side, there's one video track per participant, and the SFU quietly swaps which encoding it feeds. All the extra work sits with the sender and the server.

Simulcast only matters when there's a server in the path. In a 1:1 peer-to-peer call, the sender talks directly to one receiver, so it encodes once and lets congestion control adjust that single stream. Add a third participant through an SFU, and the mismatch problem shows up right away.

Stream's WebRTC architecture guide covers the negotiation side in more depth, including how the sender tells the browser to produce multiple encodings.

How Does the SFU Decide Which Layer Each Viewer Gets?

The SFU makes this choice for each viewer and participant, and revisits it constantly. Two inputs drive it.

  • Bandwidth. Receivers send feedback about what's arriving, mostly through transport-wide congestion control reports, and the SFU turns that into a running estimate of how much each connection can carry. A viewer on Wi-Fi with heavy interference, or on a congested mobile network, sees that estimate drop, and the SFU responds by forwarding a lower layer.
  • Layout. A participant drawn as a small tile doesn't need 720p even when the viewer has bandwidth to spare, so the client tells the SFU what size it's rendering each participant at, and the SFU picks the smallest layer that fills it. When that participant becomes the active speaker and switches to full screen, the client requests a higher layer.

So, a single point in time on a call might look like this:

Diagram showing a sender encoding 180p, 360p, and 720p to an SFU, which forwards 720p to Alice on fiber in full screen, 360p to Bob on home Wi-Fi in grid view, and 180p to Carol on a weak mobile connection

Say you're in a 20-person call in grid view, getting everyone at 360p, and you click on Kyle to make him full screen.

  • Your client tells the SFU it's now drawing Kyle at full size and everyone else as small thumbnails.
  • The SFU wants to move you from Kyle's 360p stream to his 720p one. It can't just start forwarding 720p packets, though. Every frame in that stream is encoded as a set of changes from the frame before it, so your decoder needs a keyframe, a complete picture, to start from.
  • The SFU requests a keyframe from Kyle's device on the 720p layer. This is a small RTCP message called a PLI (picture loss indication), and Kyle's encoder usually answers within a frame or two.
  • When the keyframe arrives, the SFU stops sending you Kyle's 360p packets and starts sending 720p packets instead. It rewrites the packet numbers and timestamps as it goes, so as far as your decoder can tell it's the same stream, just sharper.
  • The other 19 people just got small, so the SFU moves you down to their 180p layers the same way, which needs a keyframe from each of them, too. Anyone who's now off-screen stops being forwarded at all.

On your screen, Kyle's tile grows and for a moment shows the 360p picture stretched up, a little soft. Then the 720p keyframe lands, and it snaps sharp.

Connection changes are handled with some deliberate caution because every layer switch costs a keyframe, and keyframes are big.

  • When your connection gets worse, the SFU reacts quickly. Its first move is often to drop frame rate rather than resolution, because the encoder arranges frames so that some can be skipped without affecting the rest. The SFU just stops forwarding those frames, no keyframe needed.
  • When your connection gets better, it waits. It wants to see that you can sustain the next layer's bitrate for a while before stepping up; otherwise, a flaky connection would keep flipping between layers and every flip would trigger another keyframe.
  • Active speaker changes get a short delay for the same reason, so a two-second interjection doesn't promote someone to full screen and back.

Through all of this, the SFU never actually looks at the video. It reads packet headers, decides which packets to pass on, and forwards them. That's why one server can handle hundreds of viewers cheaply and without adding noticeable delay. A server that decoded and re-encoded video for each viewer would require far more CPU and add latency to every stream.

Building your own app? Get access to our Livestream or Video Calling API and launch in days!

Does Simulcast Triple the Sender's Upload?

Not triple, but more than a single stream. The example ladder above is 150 + 500 + 1,500 = 2,150 kbps, against 1,500 kbps for the 720p layer on its own. That's about 43% more upload. On the wire, it's slightly higher once packet headers and retransmissions are accounted for.

The extra layers are cheap because of pixel counts. Each step down the ladder halves the width and height, leaving a quarter of the pixels.

Layer Resolution Pixels per frame Compared with 720p Bitrate
Low 320 × 180 57,600 1/16 150 kbps
Medium 640 × 360 230,400 1/4 500 kbps
High 1280 × 720 921,600 1 1,500 kbps
All three 1,209,600 1.31 2,150 kbps

So the sender is encoding 31% more pixels than it would for a single 720p stream. Adding a fourth or fifth quarter-size layer barely moves that, since the series 1 + 1/4 + 1/16 + 1/64 never gets past 4/3. The bitrate overhead (43%) is higher than the pixel overhead (31%) because small pictures require more bits per pixel to remain watchable. At 30 fps, the 180p layer uses about 0.09 bits per pixel, and the 720p layer about 0.05 bits per pixel.

However, that also means the budget grows quickly in the other direction. People now expect 1080p on calls because that's what streaming services give them, and on a call the sender's device pays for it. Keep the same quarter-size steps. A 1080p ladder is 1080p at around 4,000 kbps, 540p at about 1,200 kbps, and 270p at about 350 kbps, which adds up to 5,550 kbps.

That's 2.25 times the pixels of the 720p ladder and 2.6 times the upload, and encoding work and battery drain grow with the number of pixels, too. A steady 5.5 Mbps up is more than many home connections can handle, and every participant with a camera on has to sustain it, not just whoever is on screen. Go to 4K, and the top layer alone lands somewhere around 15-20 Mbps, which is why 4K calls are still rare (thankfully).

Most viewers never receive the expensive layer either. In a grid, their tile of you is small, so the SFU hands them 540p or 270p. The 1080p encode only reaches someone who has you full screen on a fast connection, so the sender is paying for a layer that often goes unwatched.

How Is Simulcast Different From SVC, Transcoding, and Adaptive Bitrate Streaming?

All four solve the same mismatch problem. They differ in who produces the quality versions and who picks one for each viewer.

Simulcast SVC Server-side
transcoding
Adaptive
bitrate streaming
(HLS/DASH)
Who makes the
quality versions
The sender,
as separate
encodes
The sender,
as layers inside
one encode
The server, by
decoding and
re-encoding
The server, by
transcoding into
a rendition ladder
Streams the
sender uploads
Two or three One One One
Who picks the
quality per
viewer
The SFU The SFU, by
dropping layers
The server The viewer's
player
Typical latency Under a second Under a second Adds an
encode delay
on top
Seconds
Codecs Any (H.264,
VP8, VP9, AV1)
Mainly VP9
and AV1
Any Any

SVC is the closest relative. The encoder produces a single stream in which each layer builds on the one below it, and the SFU strips layers from packets rather than choosing between separate streams. That saves upload bandwidth and encoding work on the sender, and layer switches don't need keyframes.

The catch with SVC is video codec support. VP9 and AV1 support it in Chromium-based browsers, while H.264 only gets temporal layers in browsers, not spatial ones, so simulcast is still the safe default when hardware encoders or older devices are involved. Plenty of SFUs do both and choose per call.

Server-side transcoding is what an MCU does. The server decodes everything, composes or rescales it, and encodes a fresh stream for each viewer. That gives the sender the easiest job, but it costs a lot of CPU per viewer and adds latency, which is why SFUs took over for interactive calls.

Adaptive bitrate streaming (ABR) is the same idea applied to live streams and on-demand video content. The origin transcodes one input into a ladder of renditions, chops them into segments, and the player picks a rendition segment by segment. It scales to millions of viewers through a CDN, but it runs seconds behind live, so it suits watching more than talking.

Is Simulcast the Same as Multistreaming to Twitch, YouTube Live, and Facebook Live?

No. Outside WebRTC, "simulcast" is short for simultaneous broadcast: sending the same program over several channels at once.

The word comes from radio stations and TV networks. A network like CBS or ESPN might broadcast simultaneously on its main channel and a secondary one, or air a live broadcast on TV while a radio station carries the audio. Anime uses it the same way. A simulcast episode streams internationally the same day it airs in Japan, rather than months later.

For content creators and streaming platforms, the term has become interchangeable with multistreaming. One live stream goes out from OBS or a similar encoder to a service like Restream, StreamYard, or Vimeo, and that service restreams it to Twitch, YouTube Live, Facebook Live, and LinkedIn Live at the same time. Cloudflare labels its version of this "simulcast (restream)".

Every destination receives the same encode, and each platform, whether that's LinkedIn or Twitch, then transcodes it into its own quality ladder for viewers.

So the two meanings point in opposite directions:

  • Multistreaming sends a single live video encode to multiple social media platforms.
  • WebRTC simulcast sends multiple encodes of a single feed to a single server.

Twitch's Enhanced Broadcasting sits somewhere in between. OBS encodes the stream at several resolutions on the streamer's GPU and sends them all to Twitch, so the platform doesn't need to transcode. Mechanically, that's close to WebRTC simulcast, but it's still a one-to-many live broadcast with seconds of latency, and it only works for one destination.

Stream's glossary entry on simulcast covers the broadcast meaning in more detail.

How Does Simulcast Work in Large Meetings and Livestreams?

In a 100-person meeting, no viewer downloads 99 video streams at full quality, and no laptop could decode them if it did. Simulcast is half of what makes large calls workable. The other half is that the client only subscribes to what's on screen.

  • Tiles in the visible grid receive the layer that matches their rendered size, which is usually the low or medium one.
  • The active speaker, or whoever is pinned, receives the top layer.
  • Participants scrolled off-screen get paused entirely, so the SFU stops forwarding their video until they scroll back into view.
  • Screen share is usually published as one high-resolution encode at a low frame rate, since text needs sharp pixels more than smooth motion, so it typically skips simulcast altogether.

That's why per-viewer download and decode costs track the layout rather than the headcount. A viewer looking at a 3x3 grid receives nine small streams, whether the meeting has 12 people or 500.

Stream Video's SFU works this way. Dynascale decides which resolutions and codecs participants publish and which layer each viewer receives, based on the video size, network conditions, and the device, and it pauses the video for participants who aren't visible. Screen sharing publishes a single resolution. The quality and latency guide has the details.

Livestreams are where the two meanings of simulcast come together. During the call, hosts still send simulcast layers to the SFU, and viewers watching over WebRTC have a layer picked for them in the same way. To reach a much larger audience, the SFU output can be composed into a single stream and packaged as HLS for CDN delivery, or pushed over RTMP to YouTube, Twitch, and Facebook, which is the multistreaming kind of simulcast.

Stream's RTMP broadcasts do exactly that, and a single call can reach several platforms at once. Each platform then transcodes the feed into its own ladder, so a viewer on a slow connection still gets a version they can watch, a few seconds behind live.