WebRTC Metrics
A comprehensive overview of WebRTC statistics, derived indicators, and observable signals, to better understand call quality, connectivity, and user experience in rtcStats
Back
outbound-rtpoutboundvideo
qualityLimitationDurations
The total time, in seconds, that this stream has spent in each quality limitation state.
Description
Object {"bandwidth"|"cpu"|"other"|"none": number}
MUST NOT exist for audio (this is video only).
A record of the total time, in seconds, that this stream has spent in each quality limitation state. The record includes a mapping for all RTCQualityLimitationReason types ("none", "cpu", "bandwidth", "other").
The sum of all entries minus qualityLimitationDurations["none"] gives the total time that the stream has been limited.
Interpreting Values
As a rule of thumb:
| Condition | Description |
|---|---|
| "none" >95% of call time | Healthy. The encoder is running without constraints |
| "none" 80-95% | Mild limitations. Brief dips during network transitions or CPU spikes are normal |
| "none" <80% | Significant quality degradation is occurring for a large portion of the call |
- A few seconds of "bandwidth" during call start or network transitions is expected and not a concern
- Persistent "cpu" limitation means the device genuinely cannot handle the encoding workload. Often it indicates a faulty WebRTC implementation
- Any sustained limitation means receivers are getting degraded video quality and likely the application itself not doing anything to try and solve the issue
Common Causes
- "cpu" - Underpowered device (low-end laptop, older phone), high resolution configured beyond what the hardware can encode, complex codec (e.g., H.264 software encoding vs hardware-accelerated), other apps consuming CPU, too many simultaneous encoded streams in group calls
- "bandwidth" - Network congestion, limited upload bandwidth, WiFi interference or contention, competing upload traffic
- "other" - Typically both CPU and bandwidth constraints are active simultaneously. We haven't seen this reported (yet)
User Experience Impact
- The SENDER's video quality drops for ALL receivers in the call
- Lower resolution - video becomes blurry or pixelated
- Lower frame rate - motion appears choppy
- More compression artifacts - blocky regions, especially during movement
- Receivers have no control over this - it is entirely determined by the sender's device and network
Troubleshooting
- For "cpu" limitation:
- Reduce the configured send resolution (e.g., 720p instead of 1080p)
- Switch to a hardware-accelerated codec if available (check
encoderImplementation) or a different codec entirely - Close other CPU-intensive apps (video editing, gaming, compiling)
- In group calls, reduce the number of simultaneously encoded streams (simulcast layers) as well as the number of simultaneously decoded streams
- For "bandwidth" limitation:
- Check availableOutgoingBitrate to see the actual bandwidth estimate
- Reduce competing network traffic (cloud sync, downloads, other tabs)
- Switch from WiFi to a wired connection if possible
- Lower the configured maximum bitrate to match realistic network capacity
See also
Notes
- In general, our preference is for "none" to be the resulting value at all times
- Too much "cpu" time means the CPU was too busy and the encoder had to limit the bitrate it produces in order to work properly
- Too much "bandwidth" time means that the network was constrained and while we wanted to send a higher video bitrate (=better media quality), we had to limit ourselves to a lower bitrate due to the network condition
- "other" usually means that both "cpu" and "bandwidth" had an issue...