2

嘿编程社区。所以我使用 TagLib Sharp 库从我的 .mp3 中获取元数据。一切都很顺利,只有一个例外。我可以从我的 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();

我的问题是双重的。我应该/可以使用另一个 usr 来代替“Windows Media Player 9 系列”吗?或者有没有更好的方法让我从我的 mp3 中获得评分?我应该放弃Musicbee的半星评级吗?

另外,taglib 上是否有“帮助”文件?似乎我能在上面找到的所有东西都在这里找到。我什至不知道我在上面的代码中将什么设置为“true”。

提前谢谢你的帮助!

* 更新 * 这不是一个仅修复以下错误的答案:

1 = 24   to
1 = 1
4

2 回答 2

2

根据 ID3v2(3)规范,框架 4.18 POPM 的用途

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

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

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

这个KODI 线程显示了他们如何计算它:

       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
于 2017-01-14T12:48:19.913 回答
1

使用 TagLibSharp 时,第二个参数TagLib.Id3v2.PopularimeterFrame.Get应该是 POPM 框架的“Email to user”字段的值。

在您的情况下,此值应为“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;

注意:MusicBee 存储“半星”的约定与您想象的略有不同:54 = 1,5 - 118 = 2,5...

于 2018-01-04T13:31:50.623 回答