首页->大浪淘沙

关于LAME的preset参数

作者:马健
邮箱:stronghorse@tom.com
主页:http://stronghorse.yeah.net

最近为了压缩MP3,搜索了国内无数相关的帖子、文章,发现基本上所有的文章都同意一件事:LAME是目前最好的MP3编码器,而在使用LAME的时候,如果追求音质,要采用下列参数:

--alt-preset extreme

在流传甚广、被无数国内文章引用的《EAC拔苗成长指引 v3.58》中,--alt-preset xxx参数还被推荐为EAC的唯一附加命令行参数。

但是令我惊讶的是,我搜遍了LAME v3.96的帮助文档,再用命令行帮助查找,都没有找到--alt这个参数。这究竟是怎么回事?

为了找到正确的答案,我觉得最好的办法就是下载一份LAME源代码,仔细看一下。没想到在parse.c中看到了下面这段话:

/*
Note from GB on 08/25/2002:
I am merging --presets and --alt-presets. Old presets are now aliases for
corresponding abr values from old alt-presets. This way we now have a 
unified preset system, and I hope than more people will use the new tuned
presets instead of the old unmaintained ones.
*/

看来不是文章有错,也不是我没找对地方,实在是LAME发展太快了:建议在用LAME的各位,用命令行帮助查一下,您现在用的LAME还用不用--alt参数,反正我用的v3.96是不用了,直接用--preset xxx就可以了。

那么--preset extreme这个参数究竟有什么神奇的魔力,是不是设置了它以后就可以压制出效果最好的VBR文件呢?

继续追查下去,发现这个参数的处理代码:

        lame_set_VBR_q(gfp, 0);
        SET_OPTION(VBR_min_bitrate_kbps, 128, 0);

        SET_OPTION(short_threshold_lrm, 4.2f, -1);
        SET_OPTION(short_threshold_s, 25.0f, -1);
        SET_OPTION(quant_comp, 3, -1);
        SET_OPTION(quant_comp_short, 3, -1);
        SET_OPTION(psy_model, PSY_NSPSYTUNE, -1);
        lame_set_exp_nspsytune(gfp, lame_get_exp_nspsytune(gfp) | 2); /* safejoint */
        SET_OPTION(msfix, .85, -1);
        SET_OPTION(maskingadjust, -.8, 0);
        SET_OPTION(maskingadjust_short, -2.9, 0);
        SET_OPTION(ATHlower, 2, 0);
        SET_OPTION(ATHcurve, 1, -1);
        /* modify sfb21 by 3 dB plus ns-treble=0                  */
        lame_set_exp_nspsytune(gfp, lame_get_exp_nspsytune(gfp) | (12 << 20));

第一行的作用相当于参数V 0,第二行的作用相当于b 128,其它那些在常用命令行参数上就不容易找到对应的项了。

因此从源代码上看,--preset extreme参数并非万能,就算是用了它,其它该设的参数也还得设,比如--resample 44.1。

那么如果想覆盖--preset extreme的设置,比如说设置了--preset extreme,还想再设置b 256,应该怎么办呢?

从LAME源代码的命令行参数解析部分来看,如果多次对同一个参数进行设置,则以最后一次设置为准,所以命令行参数是有优先级的:最后出现的参数,优先级高于最先出现的参数,所以附加命令行参数

--preset extreme -b 256

将确实设置最低码率为256。