我想用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)?
答案 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