-
Notifications
You must be signed in to change notification settings - Fork 1k
lamejs bug修复记录
高坚果 edited this page Nov 2, 2019
·
3 revisions
lamejs,64kbps录的太大了,和那种一秒1kb的差距太大,8kbps能达到1kb但声音差太别明显,16kbps又小音质还行。
但64kbps以下确实是有无声的问题,并且是表现成不同设备没声的码率还不是固定的。
调试发现lamejs输出的采样率是通过函数 optimum_samplefreq
推荐出来的,而我们提供的源音频采样率并不一定会成为最终结果采样率:
- 对于>64kbps的,推荐的采样率类似于Math.min(48000hz, input_sampleRate),结果就是输出采样率和输入采样率是一样的。
- 对于<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来的快。
问题在于lamejs中的版本信息写入二进制时采用的charAt,导致乱码,改成charCodeAt完成修复。
已在lamejs提交了一个issue: https://github.com/zhuker/lamejs/issues/67