You can't really estimate the size the of a video file before encoding. This is not possible due to the way the codec works. It allocates a certain amount of bits to every frame, but this amount usually depends on the contents of the frame itself.
However, there are some solutions.
1. The cheap one:
Let it encode, check the file size and trash the file again
2. The "workaround":
Calculate the file size yourself using a simple calculator. This only works when using constant bit rate. Specify it with, for example,
-b 500k for 500 kBit/s. You have to make sure that you specify a bit rate the codec can use. for example, there's no way to compress a 1080p video with
200k bit rate in
mpeg4, because it would need much more than that.
3. The "real" solution:
The last option I had in mind was piping the output to
/dev/null and measuring the piped file size. That, however, won't work for all formats, because FFmpeg needs a seekable file to produce valid output.
Still, for AVI, it works pretty well. The following command will pipe into
/dev/null, thereby leaving no trace of the file itself, and finally output the encoded file size.
ffmpeg -i input.avi -vcodec mpeg4 -b 3M -f avi pipe:1 | pv > /dev/null
… for example like this:
5.42MB 0:00:10 [ 521kB/s]
What does it do?
- You have to specify the format using
-f avi. Otherwise FFmpeg won't know which format to use.
pipe:1 tells FFmpeg to write the output to a pipe.
- We will feed this output into pipe viewer, short
- Pipe viewer will measure the transferred size and output your video to
The only minor drawback is that the output looks a bit weird until the video is finished. I haven't yet found a way to fully disable FFmpeg's output and get
pv to work with this.