(原) 关于错误提示:mp3: mp3: only MPEG version 1 (want 3; got 2) is supported

原创文章,请后转载,并注明出处。

在使用github.com/faiface/beep库作用一款mp3播放器时,提示错误 “mp3: mp3: only MPEG version 1 (want 3; got 2) is supported”。
网上找遍了没有发现对此的解决方法(后来想想,估计是别人没用过老库?)。通过对代码的跟踪,发现它是调用github.com/hajimehoshi/go-mp3库。这不是重点…

在go-mp3库中发现这个提示是因为mp3的音频版本ID不是3导致的。啥意思呢? 10(2)是使用MPEG2协议,11(3)是使用MPEG1协议。虽然现在的大多数播放器也支持mpeg2,但这个库本身并不支持。所以需要将mp3音频文件转换一下,我这里使用了ffmpeg:

ffmpeg -i in.mp3 -acodec libmp3lame out.mp3

转到beep库中继续示例,依然问题。咦?
转到go-mp3打印ID,发现其实mp3并没有将ID转换成功,而是它自己已经升级支持mpeg2了(中途更新过go-mp3库),现在是不支持mpeg2.5(似乎说是自定义格式)
估计module方式导致go-mp3使用了老库,知道原因,则问题解决。

go-mp3/internal/frame/frame.go中Read函数的代码

...
	if h.ID() == consts.Version2_5 {
		return nil, 0, fmt.Errorf("mp3: MPEG version 2.5 is not supported")
	}
	if h.Layer() != consts.Layer3 {
		return nil, 0, fmt.Errorf("mp3: only layer3 (want %d; got %d) is supported", consts.Layer3, h.Layer())
	}

...

相关文章