Skip to content

lamejs编码出来的mp3时长修正

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

频谱对比

图1:原版wav频谱

图2:未处理的mp3,2019-11-03之前的代码编码出来的频谱:

图3:处理后的mp3,2019-11-03之后的代码编码出来的频谱

问题和处理办法

问题

问题一

未处理的mp3数据头几帧数据包含了信息数据,表现为静默。如图2虚线选择框左侧多出来的73ms。

问题二

mp3结尾这一帧如果录音时长不能刚好填充满这帧,那么就会存在填充数据。如图2虚线框右侧多出来的5ms,图3虚线框内的5ms。

处理

解决问题一

去掉开头的几帧即可。不过似乎有1-2ms的误差,频谱往左挪动了一点点,忽略不计。图2去掉左侧就变成了图3。

解决问题二

  • 编码时尽量凑够数据刚好填满数据帧,Layer3每帧采样数为576、1152,因此只要保证每次转码时提供的pcm长度刚好是1152的整数倍即可完全填满最后一帧。
  • 解码时去掉结尾多余部分也可解决此问题。

图中的测试音频数据

在新旧版本的demo页面内执行以下代码,然后批量编码即可获得mp3

setTimeout(function(){
	var bstr=atob(base64),n=bstr.length,u8arr=new Uint8Array(n);
	while(n--){
		u8arr[n]=bstr.charCodeAt(n);
	};
	var c=new Int16Array(u8arr.buffer.slice(44))
	rec=Recorder().mock(c,16000)
});

base64="UklGRng1AABXQVZFZm10IBAAAAABAAEAgD4AAAB9AAACABAAZGF0YVQ1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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";

"run";