Limit FFmpeg Memory Usage Using max_alloc

Running FFmpeg on small virtual private servers (VPS) with limited RAM can often lead to out-of-memory (OOM) crashes, especially when processing high-resolution videos or handling corrupted files. This article explains how to use the -max_alloc option in FFmpeg to set a strict limit on memory allocations, ensuring your server remains stable by forcing FFmpeg to fail gracefully rather than consuming all available system memory.

Understanding the -max_alloc Option

The -max_alloc option is a global FFmpeg parameter that defines the maximum size (in bytes) allowed for any single memory allocation request. When FFmpeg attempts to allocate a block of memory that exceeds this limit, the request is denied, and FFmpeg terminates the operation with an error.

By default, FFmpeg has a very high limit, which means a single complex filter, a massive video frame, or a malformed input file can request more RAM than your small server possesses. This triggers the Linux kernel’s OOM killer, which abruptly terminates the FFmpeg process or, worse, other critical system services like database or web servers.

How to Syntax and Usage

To use -max_alloc, you must pass the limit in bytes as a global option. This option should generally be placed early in your command line, before the input files.

The basic syntax is:

ffmpeg -max_alloc <limit_in_bytes> -i input.mp4 output.mp4

Calculating Bytes

You need to convert your desired megabyte (MB) limit into bytes. For example: * 50 MB: 52428800 bytes (\(50 \times 1024 \times 1024\)) * 100 MB: 104857600 bytes (\(100 \times 1024 \times 1024\)) * 250 MB: 262144000 bytes (\(250 \times 1024 \times 1024\))

Example Command

To restrict FFmpeg from allocating any single block of memory larger than 100 MB, use the following command:

ffmpeg -max_alloc 104857600 -i input.mp4 -c:v libx264 -crf 23 output.mp4

If FFmpeg attempts to decode a frame or initialize a buffer that requires more than 100 MB, the process will stop immediately and output an error message indicating that the allocation limit was exceeded.

Why This is Essential for Small Servers

Using -max_alloc is highly recommended for environments with 512MB to 2GB of RAM for several reasons: