views:

76

answers:

2

First of all, FFMPEG has the worst documentation of all time... secondly, the syntax is so trivial that it's hard to understand what some lines are doing.

What I'm looking to accomplish is the best quality FLV with the lowest file size. After all, isn't that everyone's goal? These video will be streamed if that makes a difference.

Perhaps some of you have command lines that do just this... for now, my video are no wider than 320... some are widescreen and so their heights are little smaller than 240.

As it stands, the quality of the converted FLV's are quite poor...

-i video.mov -ar 22050 -ab 32 -f flv -s 320x240 -aspect 4:3 video.flv

+1  A: 

By default flv defaults to 200Kb and with the qmax being as high as 30 (since you're not overriding it) it'll probably be producing output near that. You can fix this by either:

  • Setting qmax to a lower value forcing the quality control to up the birate to meet the requirement.
  • Upping the bitrate with -vb 400k

On the test video I just tried -qmax 10 gave acceptable output. Using qmax and qmin to set the lower and upper acceptable quality is the preferred way.

Russ
Thanks for this... can you explain what -qmax is actually doing? What does it's value represent?
dcolumbus
These values control how strict the quantizer is on the input. A q-scale of 1 will preserve as much as possible.Part way though the encoding of a frame ffmpeg works out the q-scale and decides how much to throw away/keep depending on your qmin and qmax values. If it isn't within these values it clamps to the nearest and uses that. Basically it keeps the q-scale within the limits you set and allocates bits accordingly saving bits where it manages to compress better then you require and using them up when it goes below.
Russ
So what would be a good example of good quality... keeping in mind that the defaults are producing some poor results. -qmin 8 and -qmax 10? Or do I need to do something with -qscale?I appreciate your help.
dcolumbus
Since the qmax and qmin values relate to the original files quality I'm afraid it just required some experimentation. You can use -ss <hh:mm:ss> and -t <sec> to only encode a section of the file. Try starting with -qmin 2 -qmax 8. The current qscale and bitrate are displayed as it's encoding. If the quality is still too low decrease qmax (e.g. -qmax 6), if the quality is ok but the bitrate too high increase qmin (e.g. -qmin 4).Sometime with flv you'll have just set a bitrate and let it aim for that instead (-b 400k), don't forget the k otherwise it'll assume it's in bits.
Russ
Russ, thanks a lot for helping me out with FFMPEG. I'll test this out and make sure that it does what I need it to. Would you also happen to know why it would be that when I try to set the video ratio for widescreen, the video always stays as fullscreen? I've tried using aspect ratios and then the physical video size and it doesn't seem to do anything...
dcolumbus
A: 

I think the best solution to maximize the ratio quality/size is to scrap the "flv" encoding of ffmpeg altogether, and use H.264 instead.

I'm usually using handbrake to convert files to MP4/AAC, and then only use FFMPEG to remux the file into an FLV container.

ffmpeg -i input_file.mp4 -vcodec copy -acodec copy -y output_file.flv

There are also a lot of parameters for handbrake, some interesting presets can be found here: http://trac.handbrake.fr/wiki/BuiltInPresets

SirDarius
But this is all being done server-side... can't use handbrake for that.
dcolumbus
I'm talking about the command line interface of handbrake: HandBrakeCLI, of course.
SirDarius
So you can use the command line interface on the server? I suppose you could... it seems a bit convoluted, wouldn't you say?
dcolumbus