C#使用TagLib Sharp - 错误的评级号码?

时间:2016-12-20 22:41:41

标签: c# taglib-sharp

嘿编程社区。因此,我使用TagLib Sharp库从我的.mp3s中获取元数据。除了一个例外,一切都很顺利。我可以从我的MP3中读取他们的整数(设置我的Musicbee)的评级。含义

Stars
5 = 255
4 = 196
3 = 128
2 = 64
1 = 1
unrated=0

我遇到的问题是我使用MusicBee,我可以设置半星评级。所以我应该从我的评级中得到的价值是:

Stars
5 = 255
4.5 = 224
4 = 196
3.5 = 160
3 = 128
2.5 = 96
2 = 64
1.5 = 48
1 = 1
unrated=0

然而,这就是TagLib正在阅读的内容:

5 = 255
4.5 = 0
4 = 196
3.5 = 0
3 = 128
2.5 = 0
2 = 64
1.5 = 0
1 = 1

这是我用来获得评分的代码:

TagLib.File file = TagLib.File.Create(fi.FullName);
TagLib.Tag tag = file.GetTag(TagLib.TagTypes.Id3v2);

TagLib.Id3v2.PopularimeterFrame tagInfo = TagLib.Id3v2.PopularimeterFrame.Get((TagLib.Id3v2.Tag)tag, "Windows Media Player 9 Series", true);

byte rate = tagInfo.Rating;

//This is where I'm storing the value as a string to process it later
id3.Rating = tagInfo.Rating.ToString();

我的问题是,好的,双重的。还有另一个我应该/可以使用的用户而不是" Windows Media Player 9系列"?或者有更好的方法,我应该从我的MP3获得评级?我应该放弃Musicbee的半星评级吗?

此外,是否有"帮助" taglib上的文件?看起来我能找到的一切都在这里找到。我甚至都不知道我设置的是什么" true"在我上面的代码中。

提前感谢您的帮助!

*更新* 这不是解决错误的答案:

1 = 24   to
1 = 1

2 个答案:

答案 0 :(得分:2)

根据ID3v2(3)specification,框架4.18 POPM的目的

  

...用于指定音频文件的好坏程度。可以在这个框架中找到许多有趣的应用程序,例如播放列表比其他框架更频繁地提供更好的音频文件,或者它可以用来描述一个人的品味并通过比较人们的个人资料来找到其他“好”的文件。框架非常简单。它包含用户的电子邮件地址,一个评级字节和一个四字节播放计数器,每次播放文件时都会增加一个。电子邮件是已终止的字符串。 评分为1-255,其中1表示最差,255表示最佳。 0未知。如果不想要个人计数器,则可以省略。

我知道像MediaMonkey这样的程序使用这个半星评级,但它们与规范不完全兼容。链接的MediaMonkey论坛主题解释了他们如何计算半星。

您还可以在Mp3tag的文档中查看“RATING MM”。它讲述了评级的各种实现:http://help.mp3tag.de/main_tags.html

KODI thread显示了他们如何计算它:

       Values    Rating
-----------------------

0             0   0
0.5        2-22   1
1      1, 23-31   2
1.5       32-63   3
2         64-95   4
2.5      96-127   5
3       128-159   6
3.5     160-195   7
4       196-223   8
4.5     224-254   9
5           255  10

答案 1 :(得分:1)

使用TagLibSharp时,TagLib.Id3v2.PopularimeterFrame.Get的第二个参数应为"电子邮件发送给用户"的值。 POPM框架的字段。

此值应为" MusicBee" ,以及" Windows Media Player 9系列"。

=>工作代码如下(使用真实的MusicBee文件测试)

TagLib.File file = TagLib.File.Create(fi.FullName);
TagLib.Tag tag = file.GetTag(TagLib.TagTypes.Id3v2);

TagLib.Id3v2.PopularimeterFrame tagInfo = TagLib.Id3v2.PopularimeterFrame.Get((TagLib.Id3v2.Tag)tag, "MusicBee", true);

byte rate = tagInfo.Rating;

NB:MusicBee商店"半星"与你想象的略有不同的约定:54 = 1,5 - 118 = 2,5 ......