What parameters should I be looking at to reduce the size of a .MOV file?

Solution 1:

But I'm wondering if there's a way to determine a "good" target bitrate …

A good target bit rate is the bit rate that either:

  • is supported by the network you're streaming the material from (e.g. a 3G network, home WiFi, etc.), which is pretty easy to calculate
  • looks good to you, which is a very subjective measure

22 Mbit/s or 45 Mbit/s are indeed quite high for the average user, and especially for already compressed video like h.264. You could definitely go ahead and reduce the bit rate to a "sane" value, always with regards to how much storage capacity you can afford and how much quality you want to lose.

You could also resize 1080p video to 720p if you don't really need the size or don't have the processing capability to edit it.

… or if there's any point in trying to do variable bitrate

The point of constant bit rate is to adapt to a streaming media scenario where there's a bottleneck that limits the maximum bit rate of the transmitted video. In today's multimedia world, this doesn't necessarily make sense anymore.

When you squeeze a video into a constant amount of bits per second, you basically tell an encoder to always use the same amount of bits to encode the same time frame. Is that the best approach? As you may have guessed by now, it's not. Quoting the CRF Guide from Handbrake (I will come back to this later):

The eye perceives more detail in still objects than when they're in motion. Because of this, a video compressor can apply more compression (drop more detail) when things are moving, and apply less compression (retain more detail) when things are still. Subjectively, the video will seem to have higher quality.

So, it does make sense to use variable bit rate whenever you can. It will make the video look better, even at the same file size of a constant bit rate video.

Even more so, most encoders – the most famous one being x264 – often perform very bad when you tell them to use a constant bit rate. It's better to give them a bit more "freedom" in the sense of how many bits they want to spend on a frame. After all, that's the job of the encoder, and not you. And that's called "constant quality".


Enough of that – what does that mean in practice? If you use FFmpeg to encode videos, then you're already using a good enough tool. If you now also have x264 installed, and use the latest version of both, then you're using one of the best encoders that's currently available for free. Instead of encoding with a fixed bit rate, let x264 choose how much it wants to spend. Do this by using the Constant Rate Factor option.

In a very simple case this means setting a value between 17 and 23. I choose MP4 as output container instead of MOV because there are better tools for remultiplexing available:

ffmpeg -i input.mov -c:v libx264 -crf 22 output.mp4

The lower the value, the better the quality, and the larger the output. Vice versa, the higher, the lower the quality. At the same time, you will of course reduce the average bit rate needed. Check the x264 encoding guide for more info about ffmpeg.

Your task is now to find a CRF value that:

  • reduces the overall bit rate to the point you can afford
  • doesn't reduce the quality too much, so that the video still looks good

Yes, this involves a lot of encoding and trial-and-error, but this is daily business when you're tuning and encoding video.

Oh, and if you don't like the command line, Handbrake is a free, cross-platform tool that does exactly the same. It even has a CRF slider:

enter image description here

Solution 2:

Try HandBrake CLI

I wanted to shrink some MOV files and didn't care to learn all the details about video options. HandBrake CLI is what I used. The presets are nice:

HandBrake offers hard coded, factory-fresh presets that are exactly the same as the built-in presets in the MacGui.

In my case, this worked nicely:

HandBrakeCLI -i input.MOV -o output.mp4 --preset="Normal"

With no preset, the output was very small but not good quality. The "Normal" preset looked good to me, but you can see other available ones with HandBrakeCLI --preset-list, or tweak all the options yourself if you prefer.