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
pv
.
- Pipe viewer will measure the transferred size and output your video to
/dev/null
.
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.
wow, thanks for the comprehensive answer slhck – Fidel – 2011-10-24T13:57:15.607