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
On this page6 sections
Quality limitation (feature)
Last updated Applies tortcstats-serverrtcstats.com
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