How to Use FFmpeg Threads and Thread Type Parameters
This article explains how to use the -threads and
-thread_type parameters in FFmpeg to optimize video
encoding and decoding performance. You will learn what these settings
do, how they affect system resource utilization, and how to configure
them to achieve faster processing speeds or lower latency depending on
your specific use case.
Understanding the
-threads Parameter
The -threads parameter controls the number of CPU
threads that FFmpeg allocates for encoding or decoding tasks. By
default, most modern codecs in FFmpeg are configured to utilize your CPU
efficiently, but manual adjustment can help you optimize performance or
limit resource usage.
You can set the -threads parameter using the following
values:
0(Default / Auto): FFmpeg automatically detects the number of logical CPU cores available and chooses the optimal number of threads (usually 1.5 times the core count for some codecs, or equal to the core count).1: Forces FFmpeg to use a single thread. This is useful for debugging, running FFmpeg on low-resource systems, or when you want to minimize CPU consumption so other applications can run smoothly.- Specific Integer (e.g.,
4,8,16): Explicitly defines the number of threads. Use this to restrict FFmpeg to a specific portion of your CPU’s capability (e.g., assigning 4 threads on an 8-core system).
Example Command:
To limit FFmpeg to 4 threads during a conversion, use:
ffmpeg -i input.mp4 -threads 4 output.mp4Understanding the
-thread_type Parameter
While -threads dictates how many threads to
use, -thread_type determines how those threads
collaborate to process the video. This parameter is codec-dependent and
primarily supports two multi-threading methodologies:
frame: This method processes multiple video frames in parallel. Thread 1 processes frame 1, thread 2 processes frame 2, and so on.- Pros: High throughput and excellent CPU utilization.
- Cons: Increases decoding/encoding latency and memory usage, as multiple frames must be buffered in memory simultaneously.
slice: This method splits a single video frame into multiple horizontal sections (slices) and processes those slices in parallel.- Pros: Very low latency, making it ideal for live streaming and real-time playback.
- Cons: Slightly lower compression efficiency and overall speed compared to frame threading.
slice+frame(orbothdepending on the codec): This combines both methods, allowing FFmpeg to process multiple slices of multiple frames simultaneously.
Example Command:
To force slice-based threading for a low-latency live stream:
ffmpeg -i input.mp4 -thread_type slice -threads 4 output.mp4Best Practices for Performance Optimization
To get the best performance out of FFmpeg, align these parameters with your project requirements:
- For Maximum Encoding Speed (File Conversion): Leave
-threadsat0(or omit it) and set-thread_typetoframe(or let the codec default to it). This maximizes CPU utilization across all cores. - For Live Streaming and Real-Time Playback: Set
-thread_typetoslice. This reduces frame delay, ensuring the video stream is processed and transmitted with minimal lag. - For Shared Server Environments: If you are running
FFmpeg on a shared server, avoid the default
-threads 0as it will attempt to consume all CPU cores, potentially slowing down other services. Instead, explicitly set-threadsto a reasonable limit (e.g.,-threads 2or-threads 4).