如何使用golang id3-go库获取和打印mp3流行度表框架

时间:2018-10-21 09:58:43

标签: go id3 id3v2

我想用id3-go从文件中读取Popularimeter框架。

这是使用mutagen-inspect打印时的框架外观:

$ mutagen-inspect samples/with_popm.mp3 | grep POPM
POPM=traktor@native-instruments.de=0 255/255

我想从文件中读取值(255/255)。由于找不到任何文档,因此我的幼稚方法是:

popFrame := mp3File.Frame("POPM")
log.Println(popFrame.String())

但是当我运行此文件(在带有或不带有Popularimeter标记的文件上)时,出现分段错误:

$ ./id3-go-popm-example samples/with_popm.mp3 
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x40 pc=0x4ac302]

goroutine 1 [running]:
main.main()
    /home/ifischer/src/rivamp/rivamp-dist/id3-go-popm-example/main.go:21 +0xd2
$ ./id3-go-popm-example samples/without_popm.mp3 
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x40 pc=0x4ac302]

goroutine 1 [running]:
main.main()
    /home/ifischer/src/rivamp/rivamp-dist/id3-go-popm-example/main.go:21 +0xd2

我在此处设置了一个示例存储库,其中包含两个示例文件(一个带有,没有流行度表框架):https://github.com/ifischer/id3-go-popm-example

如何使用id3-go库获取Popularimeter值(255/255)?

1 个答案:

答案 0 :(得分:3)

由于mp3File.Frame("POPM")实际上返回了nil值,因此出现了分段错误。我将其范围缩小到V23FrameTypeMap中的id3-go,它缺少TRDC框架。我真的不太熟悉ID3的内部原理,但是也许您需要检查TRDC是否确实在V2.3中,如果确实如此,请在V23FrameTypeMap的{​​{1}}中添加缺少的ID。

由于学习ID3太麻烦了,因此我设法使用另一个库https://github.com/dhowden/tag来获取id3-go标签

POPM

输出:

f, _ := os.Open("with_popm.mp3")
m, _ := tag.ReadFrom(f)
fmt.Printf("%s\n", m.Raw()["POPM"])

编辑:我将traktor@native-instruments.de 误认为TDRC,这是我的错。无论如何,这是您需要使用TRDC

来获取POPM字段的方法

id3-go的{​​{1}}中添加以下内容

V23FrameTypeMap

然后,您可以轻松获取github.com/mikkyang/id3-go/v2/idv23.go字段,例如

V23FrameTypeMap = map[string]FrameType{
    //...
    "TDRC": FrameType{id: "TDRC", description: "Recording Date", constructor: ParseTextFrame},
}

编辑2:我添加了一种方法,使您可以解析POPM字段。然后,您可以从package main import ( "fmt" id3 "github.com/mikkyang/id3-go" ) func main() { f, _ := id3.Open("with_popm.mp3") p := f.Frame("POPM") fmt.Printf("%s\n", p.Bytes()) } 访问等级255/255:

POPM