Role of the FFmpeg -bufsize Parameter in Streaming
When streaming live video using FFmpeg, maintaining a stable bitrate
is essential to prevent playback stuttering and dropped frames. This
article explains the role of the -bufsize parameter, how it
works in tandem with the -maxrate parameter to control the
Video Buffer Verifier (VBV), and how to calculate the optimal buffer
size for your live streams.
What is the -bufsize Parameter?
The -bufsize parameter sets the size of the encoder’s
rate control buffer. In live streaming, it is used to configure the
Video Buffer Verifier (VBV) model. The VBV model simulates a hardware
buffer on the receiving client’s side (like a media player or browser)
to ensure that the stream’s bitrate does not fluctuate so violently that
it causes buffering or data overflow.
While -maxrate defines the maximum allowable limit of
the bitrate, -bufsize determines how often the encoder
checks and corrects the bitrate to stay within that limit.
How -bufsize Works with -maxrate
To understand -bufsize, you must look at its
relationship with -maxrate. Together, they define a virtual
“bucket” that holds data:
- The Bucket Size (
-bufsize): The physical capacity of the bucket. - The Drain Rate (
-maxrate): The rate at which data leaves the bucket.
If you set -maxrate 4000k and
-bufsize 4000k, you are telling the encoder that it has a
buffer capacity of 4,000 kilobits, and the network can stream this data
out at a maximum speed of 4,000 kilobits per second. This effectively
represents a one-second buffer.
Small vs. Large Buffer Sizes
The ratio between -bufsize and -maxrate
significantly impacts stream latency and visual quality:
- Small Buffer (e.g.,
-bufsizeis half of-maxrate): The encoder checks the bitrate frequently (every 0.5 seconds). This results in a highly stable, flat bitrate ideal for ultra-low latency streaming. However, during high-motion scenes, the encoder cannot briefly spike the bitrate to preserve image quality, which may result in visual blockiness. - Large Buffer (e.g.,
-bufsizeis double-maxrate): The encoder checks the bitrate less frequently (every 2 seconds). This allows the encoder to “borrow” bits from low-motion scenes to use during high-action scenes, resulting in better overall visual quality. However, these sudden spikes in data can saturate slower internet connections, leading to playback buffering for viewers.
Recommended Configurations
For standard RTMP and HLS streaming (such as streaming to YouTube, Twitch, or Facebook Live), a one-second buffer is the industry standard. This offers the best balance between consistent network delivery and video quality.
Constant Bitrate (CBR) Example
For a strict constant bitrate stream at 6 Mbps:
ffmpeg -i input.mp4 -c:v libx264 -b:v 6000k -maxrate 6000k -bufsize 6000k -f flv rtmp://live.server.com/app/stream_keyConstrained Variable Bitrate (CVBR) Example
For a variable bitrate that allows minor quality bursts but enforces a strict ceiling:
ffmpeg -i input.mp4 -c:v libx264 -b:v 4000k -maxrate 6000k -bufsize 6000k -f flv rtmp://live.server.com/app/stream_keyBy properly configuring -bufsize alongside your target
bitrate, you ensure your stream remains compatible with the target
platform’s ingestion servers and provides a smooth viewing experience
for your audience.