在使用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())
}
...