Posted
技术标签:
【中文标题】如何使用 golang id3-go 库获取和打印 mp3 Popularmeter 框架【英文标题】:How to get and print mp3 Popularimeter frame with golang id3-go library 【发布时间】:2018-10-21 09:58:42 【问题描述】:我想从带有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())
但是当我运行它时(在带有和不带有流行量表标签的文件上),我得到了分段错误:
$ ./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 库获取 Popularmeter 值 (255/255)?
【问题讨论】:
实际的段错误/回溯也可能会有所帮助。 @ShiDoiSi 用段错误更新了问题 我刚刚完成了对 id3-go 库的检查,这绝对是第 3 方的问题。可能的解决方案是: 1. 修复 id3-go 上的问题; 2.或者只是使用另一个库,比如@ssemilla's answerid3-goTDRC
id3-go
【参考方案1】:
mp3File.Frame("POPM")nilid3-goV23FrameTypeMapTRDCTRDCid3-goV23FrameTypeMap
POPM
f, _ := os.Open("with_popm.mp3")
m, _ := tag.ReadFrom(f)
fmt.Printf("%s\n", m.Raw()["POPM"])
哪个输出:
traktor@native-instruments.de
TDRCTRDCid3-goPOPM
V23FrameTypeMapgithub.com/mikkyang/id3-go/v2/idv23.go
V23FrameTypeMap = map[string]FrameType
//...
"TDRC": FrameTypeid: "TDRC", description: "Recording Date", constructor: ParseTextFrame,
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())
POPMPopularimeter.Rating
import (
"bytes"
"encoding/binary"
"errors"
"fmt"
id3 "github.com/mikkyang/id3-go"
)
func main()
f, _ := id3.Open("with_popm.mp3")
popm := f.Frame("POPM")
popularimeter, _ := FromData(popm.Bytes())
fmt.Println(popularimeter)
type Rating uint8
func (r Rating) String() string
if r == 0
return "unknown"
return fmt.Sprintf("%d/255", r)
type Popularimeter struct
Email string
Rating Rating
Counter uint32
func FromData(data []byte) (*Popularimeter, error)
tokens := bytes.SplitN(data, []byte0x0, 2)
// Pupolarimeter: <string>, null, 1byte rating, 4bytes counter
if len(tokens) != 2 || len(tokens[1]) != 5
return nil, errors.New("invalid Popularimeter")
return &Popularimeter
Email: string(tokens[0]),
Rating: Rating(tokens[1][0]),
Counter: binary.BigEndian.Uint32(tokens[1][1:]),
, nil
【讨论】:
答案值得赏金,尤其是解释!但是最好使用 id3-go,因为它也可以修改 ID3 标签id3-go
解析 POPM以上是关于如何使用 golang id3-go 库获取和打印 mp3 Popularmeter 框架的主要内容,如果未能解决你的问题,请参考以下文章