A live encoder does not send data at a perfectly constant rate — it packs each frame into a short-term encoder buffer (a leaky bucket) before the network drains it out over the upload link:
buffer[t+dt] = buffer[t] + encoderBits(t) - min(buffer[t], bandwidth * dt)
capacity = bufferDepth(s) * encoderBitrate
overflow = max(0, buffer - capacity) -> dropped frame, buffer clamped to capacity
Each simulated frame injects encoderBitrate / fps bits into the buffer, with every Nth frame (a keyframe / I-frame) injecting roughly 3x that, mirroring real GOP structure. The buffer continuously drains at the upload bandwidth. If the encoder bitrate exceeds the upload bandwidth for long enough, the buffer fills faster than it drains and frames start getting dropped — this is exactly the stutter/frame-drop you see in OBS or a game-console broadcast when "bitrate exceeds your upload speed".
- Resolution presets set a recommended-bitrate reference line (roughly bits-per-pixel guidance broadcasters use) so you can see when your encoder setting is too low or too high for the chosen resolution.
- Buffer depth is the encoder's rate-control buffer size in seconds — a deeper buffer absorbs short bandwidth dips but adds latency; a shallow buffer reacts fast but drops sooner.
- Dropped frames count every time the buffer overflows and data has to be discarded — the real-world cause of pixelation and stalls during a live broadcast.
Real-world relevance: this is the same rate-control loop every streaming encoder (OBS, hardware encoders, game-console broadcast) and CDN ingest server runs continuously to decide when to drop frames versus stall the stream.