Linux | How To Easily Compress a Video With ffmpeg

Every here and there, you may come across a use case where it’s necessary to reduce a video file by 50-80% without any noticeable loss of quality. Often times it’s for front-end performance reasons but can also come in handy if a server has an upload limit (50MB on a typical WordPress site for example).

There are several ways to approach this, some including online solutions that require you to upload a file to their server, have it processed, then sent back.

This can work, but you generally:

  • Have to wait longer due to the server processing barrier

  • Have less control over the results

  • Have to send your data to a server you know nothing about

In this article, I hope to shine light on an alternative that comes with many Linux systems out of the box, is free, and quick to use and learn.

What is ffmpeg?

In short: ffmpeg is a library that will take care of all your multimedia needs. Want to convert a video file between two formats? ffmpeg. Want to compress a file as much as possible? ffmpeg for sure. Once you learn how to use it, it really starts to come in handy. If you’re on a modern Linux distro, it’s most likely already on your system.

Try it! Type ffmpeg into your terminal. Otherwise, it should be as simple as running sudo apt install ffmpeg. If you’re on another distro besides Ubuntu/Debian, just type in the equivalent for your package manager.

Making sure you have the right format

First things first, to compress a video file, it needs to be in a common format such as mp4. Sometimes, video formats can be “locked” to something like mv4, which makes it hard to do anything with the data. Luckily, converting this with ffmpeg is a breeze. I’ll show an example to convert a mv4 file into mp4. From there, it should be easy to compress.

ffmpeg -i input.m4v -vcodec copy -acodec copy output.mp4

This takes input.mv4 (the file you want to convert) and turns it into output.mp4 (the name of the new returned file). There’s also a shorthand code: ffmpeg -i input.m4v -c copy output.mp4.

You can likely do this with any other unplayable media type, just modify the arguments.

Source

Compressing the file

Here’s the fun part: seeing the real magic of ffmpeg. All you need to do is cd into the directory that contains the video, then run the command you need to compress. Here’s what I use:

ffmpeg -i input.mp4 -vcodec libx265 -crf 20 output.mp4

This command sets the constant rate factor and also lowers the overall bitrate. The number after -crf can range from 18 to 24, so there’s room for experimentation there.

For my purposes, I uploaded a compressed video through the WordPress admin, but the video on the front end wasn’t loading. Turns out, you can also compress using the libx264 argument. Try this if the above doesn’t work!

A simpler approach
You can also run ffmpeg with no arguments and get decent results:

ffmpeg -i input.mp4 output.mp4

This works because ffmpeg performs some optimizations when run on its own. It’s worth a try!

Source

Wait, there’s more!

What I presented here is powerful, but only a small fraction of what ffmpeg can accomplish. If you look at the docs, you’ll see there’s a much wider range of potential. For my own purposes, compressing video files is useful enough on its own. It’s always better than relying on a third party service, and even compresses quite a bit more. Mess around with it and see for yourself! At the end of the day, the little tools that come with a Linux build are usually a solid option.

Comments

Leave a Reply to Anonymous Cancel reply

  • Anonymous

    Posted on

    Many thanks! This is an awesome webpage!

  • Anonymous

    Posted on

    wait, the constant rate factor can vary from 0 to 51 in libx265, 18 to 24 is for libx264 codec.

  • Anonymous

    Posted on

    Hi and thank you for these commands this commands were quiet helpful for me.
    From my own lil experience using libx265 and setting the -cfs to 28 i personally found that the higher the -cfs is the more it compresses,also tested the libx264 to the max -cfs but the output i was getting wasn’t particularly satisfying for me since i was compressing few episode of a TV Series and the original size was in range from 300MB to 800MB.
    As far as i can tell the audio video sync its pretty much good.
    Thank you for sharing,really appreciated.