How to install FFmpeg on Linux from Source
Tags: howto, ffmpeg, linux, ubuntu
Published: 2023-09-18 22:16:06

> Tailoring your multimedia toolkit for best performance on Ubuntu, CentOS, RedHat, or any other Linux Distribution

### **Introduction**
It was probably 2006 when I first heard about FFmpeg, and I was amazed by its capabilities. FFmpeg is a go-to solution for transcoding, and video manipulation, from trimming to burning the subtitles, adding a watermark, and more. Since FFmpeg was first launched, it has come a long way and has become the industry leader for multimedia workload for desktop apps, web, and especially on the backend.
In this article, we will discuss, Why you need to customize FFmpeg to match your requirements? and How you can compile FFmpeg from source along with various essential libraries and codes needed for video processing on different Linux distributions, from Ubuntu to Redhat based systems.

### Problem
Installing FFmpeg directly from a Linux distribution's default repositories may seem like a no-brainer, but this method is filled with potential drawbacks. For one, these repositories might not offer the most recent versions of FFmpeg and essential codecs or libraries, possibly exposing users to security risks and preventing them from accessing the latest features. Moreover, these default builds can be burdened with unnecessary codecs and libraries that many users may never use, or you might stranded in a scenario where the package has everything but does not come with the library you need.
But the challenges don't stop here; in today's diverse device ecosystem, which spans across ARM and x86_64 architectures, a one-size-fits-all build from the repository might not be optimized for a specific device with a specific instruction set. This is especially concerning for multimedia tasks that demand real-time processing, and you want to make the most out of the hardware you have.
Furthermore, for young developers or those new to the Linux landscape, crafting a custom FFmpeg build tailored to their requirements can be a daunting experience. The sea of options, configurations, and dependencies can be overwhelming, leading them to settle for suboptimal, generic builds rather than extracting the true potential of FFmpeg.

### Why Compile from Source?

To overcome discussed problems for newbies to experts, the importance of comprehensive guides and resources to bridge the knowledge gap and empower the next generation of developers to confidently customize their multimedia tools. Following are the notable advantages of using source code as the starting point.

1. **Customization**: By compiling from the source, you can choose the exact features and codecs you want, leading to a personalized FFmpeg build tailored to your needs.
    
2. **Smaller Footprint**: When you include only the components you need, the resultant build will often be leaner and require less disk space.
    
3. **Access to the Latest Code**: Official channels might not always have the latest version of FFmpeg. Compiling from source ensures you're working with the most recent codebase.
    
4. **Performance Optimizations**: Building from source code can enable certain optimizations specific to your machine's architecture and instruction set, potentially enhancing performance.
    
5. **Greater Learning Opportunity**: Compiling software from a source provides a deeper understanding of the software and its dependencies.
    

### Installing Dependencies

Before we jump into the installation process, it's essential to set up our system with the necessary dependencies.

#### On Ubuntu:

```bash
sudo apt update
sudo apt install -y build-essential yasm cmake libtool libc6 libc6-dev unzip wget
```

#### On RedHat-based distributions:

```bash
sudo yum groupinstall "Development Tools"
sudo yum install -y yasm cmake libtool unzip wget
```

### Installing dependencies and codes:
Once your build environment is set up, the next critical step is to install the various codecs and libraries that FFmpeg relies upon or that you wish to utilize for specific multimedia tasks. Remember, one of the key benefits of building from source is the ability to customize your FFmpeg installation, ensuring it's streamlined to your needs; here you can pick and drop or even add codecs or libraries that you wish to use.

In the final script, we have provided a comprehensive list of dependencies and libraries, ensuring that you have a broad spectrum of multimedia capabilities at your fingertips.

### Installing FFmpeg

You can obtain the latest source code from FFmpeg's official website or use `git`:

```bash
git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg
cd ffmpeg
```

### Configuration

This step is crucial. The `./configure` script allows you to select which features and codecs to include. For a basic setup, you can run:

```bash
./configure \
            --prefix="$USR_LOCAL_PREFIX" \
            --disable-static --enable-shared \
            --extra-cflags="-I$USR_LOCAL_PREFIX/include $NVIDIA_CFLAGS" \
            --extra-ldflags="-L$USR_LOCAL_PREFIX/lib $NVIDIA_LDFLAGS" \
            --extra-libs='-lpthread -lm' \
            --bindir="$USR_LOCAL_PREFIX/bin" \
            --enable-gpl --enable-libaom --enable-libass \
            --enable-libfdk-aac --enable-libfreetype --enable-libmp3lame \
            --enable-libopus --enable-libvorbis --enable-libvpx \
            --enable-libx264 --enable-libx265 --enable-nonfree \
            --enable-openssl
```

However, for a more customized setup, use flags like `--enable-codec`, `--disable-codec`, `--enable-libx264`, etc. Check `./configure --help` for a full list of options.

### Compilation & Installation

Once configured, compile and install FFmpeg here:

```bash
make -j$(nproc)
sudo make install
```

This will use all your CPU cores for the compilation (`-j$(nproc)`) and then install the software.

### Verification

To verify your FFmpeg installation:

```bash
ffmpeg -version
```

### Wrap up & the magic script:

By now, you should have a basic understanding of how to customize FFmpeg. If so, that was our goal. If you have any confusion, leave a comment and I'll be happy to discuss. To streamline everything and every step mentioned here, there's a script for you to simply run, and it will handle the entire process.

{% embed https://gist.github.com/bilalmughal/83de56f470bf5b91a7c4424cce4071ac %}

### Conclusion

Now that we've gone through the process, I'm curious: Where do you plan to use your custom-tailored FFmpeg? Are you working on an innovative multimedia project, developing a web application, or just experimenting with video processing for personal use? FFmpeg's versatility excels in a multitude of applications, from large-scale video platforms to hobbyist projects. Share your plans or current FFmpeg projects in the comments below. Let's learn from one another and discover even more unique use cases for this powerful tool. Remember, the world of multimedia is vast, and with FFmpeg, the possibilities are endless.