Skip to content

lamejs bug修复记录

高坚果 edited this page Nov 2, 2019 · 3 revisions

2018-12-17

关于码率不能低于64kbps的解决办法

lamejs,64kbps录的太大了,和那种一秒1kb的差距太大,8kbps能达到1kb但声音差太别明显,16kbps又小音质还行。

但64kbps以下确实是有无声的问题,并且是表现成不同设备没声的码率还不是固定的。

调试发现lamejs输出的采样率是通过函数 optimum_samplefreq 推荐出来的,而我们提供的源音频采样率并不一定会成为最终结果采样率:

  1. 对于>64kbps的,推荐的采样率类似于Math.min(48000hz, input_sampleRate),结果就是输出采样率和输入采样率是一样的。
  2. 对于<64kbps的,推荐的采样率就五花八门了,结果就是输出和输入的采样率不一致,lamejs就要对我们提供的输入数据进行采样,进而有可能导致最终结果没有声音。

对于为什么进行采样了的会有可能没有声音,可能是lamejs哪里代码精简错了(比如尝试使用ABR,虽然有代码,但是被删的差不多了),具体原因未能查明,但问题的位置算是找到了。

修改lamejs,不让他进行推荐输出码率,可以修改optimum_samplefreq相关的地方,或者直接增加一个设置:

function Mp3Encoder(channels, samplerate, kbps) {
	......
	gfp.in_samplerate = samplerate;
	
	//增加下面这行
	gfp.out_samplerate = samplerate;
	......
}

固定输出码率为我们的输入码率,测试8-64kbps码率都有声音。

ps: 固定码率后,我们调用encodeBuffer时音频数据参数的采样率必须和我们给lamejs设置的采样率一致。so,如果我们录音得到的PCM数据是48khz,要32khz的mp3,那么我们调用encodeBuffer前就要把PCM数据抽样成32khz,然后传给lamejs进行编码。不然声音会被拉长或压扁。

后面还在lamejs发现一个PR,修复方法和这个一模一样,这就尴尬了,白忙活了,还不如copy来的快。

2019-11-03

编码出来的mp3文件LAME信息乱码

问题在于lamejs中的版本信息写入二进制时采用的charAt,导致乱码,改成charCodeAt完成修复。

已在lamejs提交了一个issue: https://github.com/zhuker/lamejs/issues/67