[MPlayer-users] mencoder: effective use of qp, crf params for x264?

matthew.garman at gmail.com matthew.garman at gmail.com
Wed Jan 31 18:15:10 CET 2007


On Wed, Jan 31, 2007 at 08:25:47AM +0100, Guillaume POIRIER wrote:
> If you wanna re-implement this (BTW, this is called a compression
> test), say you encode 5% of the movie, with fast options, with 20
> chunks of video taken at evenly separated parts of the movie. You
> encode at qp=18, which corresponds to a "perfect" encode (i.e.
> there won't be any encoding artifacts due to too high quants), yet
> not lossless encode.

Just out of curiosity, if qp=0 is lossless and qp=18 is "perfect",
what do qp=1 through qp=17 represent?

> Your sample ends up weighting 150MB, so 150*20=3000 the full encode
> would be 3000MB.

And you'd also use that 150MB to get the bitrate, right?  E.g., if
that 150MB represented a 20 second clip, then the bitrate would be
150*1024*1024 / 20 / 1024 = 7680KB/s, right?

> You can bet that with two pass, better encoding options, longueur
> encoded sequences, and the fact that quant 18 is probably
> overkill, so it's safe to say that you can compute your bitrate
> between 40 and 60% of the 3000MB found by the compression test.

So then you'd take that 7680kbs * 60% = 4608kbs, and that's what
you'd pass in for vbitrate in your x264encopts, right?

I started to work through this; I'll outline my methodology to make
sure it's right (and hopefully help others out in the future).  Note
that I'm using the "Batman Begins" DVD for all this.

- I used midentify to get the length of the video:
    $ midentify dvd://1 | grep ID_LENGTH
    ID_LENGTH=8392.80

- I want to sample 5% of this movie, so 8392.8 * 0.05 = 419.64.  I
  want 20 chunks of video to total about 419 seconds, so 419/20 =
  21.  So encode 21 secs at time 0, 419, 838, 1257, etc.  (In my
  test I simplified the interval to 400)
    $ for i in 0 400 800 [...] 8000; do \
        echo "==== $i ====" ; \
        mencoder dvd://1 -v -alang en -aid 128 -oac copy -ovc x264
        -x264encopts qp=18:partitions=all:8x8dct:me=umh:subq=6:frameref=5:threads=auto:bframes=4:b_pyramid:weight_b \
        -idx -ofps 24000/1001 
        -o /dev/null -ss $i -endpos 21 >/dev/null 2>>stderr.txt \
      ; done
    
  * I had some problems here (see below), but I'll ignore them for
    now

- Analyze the stderr.txt file that resulted from the above command;
  look for occurances of the following line:
    x264 [info]: kb/s:3516.1
  Take the average of all the kb/s reported for each mencoder run.

- Discover that my average is about 2000 kb/s.  Take 2000 * 0.6 =
  1200, and use that as my vbitrate for the full two-pass encoding
  of the entire movie.

* Note that I use -ss and -endpos to "chunk" the movie.  However,
  in the loop above, when I get to around ss=4400, mencoder
  segfaults (on that and every subsequent iteration):

    The selected video_out device is incompatible with this codec.
    Try adding the scale filter, e.g. -vf spp,scale instead of -vf spp.
    Filters have not been configured! Empty file?
    Segmentation fault

Hopefully I'm on the right track...

Thank you and everyone else so much!

Thanks again,
Matt




More information about the MPlayer-users mailing list