WebRTC Metrics
A comprehensive overview of WebRTC statistics, derived calculations, extracted features, and observable signals, to better understand call quality, connectivity, and user experience in rtcStats
Quality limitation (feature)
Track-level features breaking down why outbound video was degraded (CPU, bandwidth, or other) as a fraction of the track's lifetime, plus resolution-change count.
Description
Track-level features, extracted per outbound video track into features_track, from last-getStats ratios.
These features decompose why the encoder had to reduce quality, as a fraction of the track's lifetime:
cpuQualityLimitationPercentage- fraction of time the encoder was CPU-limited.bandwidthQualityLimitationPercentage- fraction of time it was bandwidth-limited.otherQualityLimitationPercentage- fraction limited byother.qualityLimitationResolutionChanges- cumulative count of resolution changes triggered by quality limits.
Extracted by the open-source rtcstats-features package.
Why it matters
When outbound video looks bad, the first question is always whose fault is it: the machine or the network? These features answer it directly. A high cpuQualityLimitationPercentage means the encoder couldn't keep up (an underpowered device, or too many concurrent streams); a high bandwidthQualityLimitationPercentage means the network couldn't carry the target bitrate. The two demand opposite responses (lower resolution/framerate vs. improve the path), so splitting them at the population level tells you where to invest. qualityLimitationResolutionChanges counts how often the encoder had to renegotiate resolution, a marker of unstable conditions.
Typical values
- Good: all limitation percentages near 0.
- Concerning: a sustained CPU or bandwidth fraction above ~0.2 across a cohort.
- Many
qualityLimitationResolutionChangesindicates volatile CPU or network conditions.
SQL example
Average limitation breakdown for outbound video, on connections that actually established:
SELECT
AVG(track.cpu_quality_limitation_percentage) AS avg_cpu_limited,
AVG(track.bandwidth_quality_limitation_percentage) AS avg_bw_limited,
AVG(track.other_quality_limitation_percentage) AS avg_other_limited
FROM features_track AS track
JOIN features_connection AS connection ON connection.id = track.connection_id
WHERE connection.connected -- only connections that reached 'connected'
AND track.kind = 'video' -- 'audio' or 'video'
AND track.direction = 'outbound'; -- 'inbound' or 'outbound'
Related features
- Lifetime averages - the outbound bitrate this limitation constrained.
- Frame counters - encode volume and key-frame behaviour.
- Freezes - the inbound counterpart of quality trouble.
See also
- rtcstats-server feature extraction - the full feature reference.
- How to query rtcstats-server features - includes the quality-limitation recipe.
- MDN: RTCOutboundRtpStreamStats->qualityLimitationReason