【问题标题】:C# using TagLib Sharp - Wrong Rating Number?C# 使用 TagLib Sharp - 错误的评级号码?
【发布时间】:2016-12-20 22:41:40
【问题描述】:

嘿编程社区。所以我使用 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

【问题讨论】:

    标签: c# taglib-sharp


    【解决方案1】:

    根据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
    

    【讨论】:

    • 这对我没有帮助。我不需要知道 mediamonkey 或 kodi 是如何计算的。我需要弄清楚为什么 TagLib Sharp 库不能正确读取它。
    • @KerryWhite 难道 TagLib 只是符合 ID3 规范吗?
    • 我自己用 MusicBee v3.1.6512 做了一些尝试:评级值存储在适当的 ID3v2.3 POPM 字段中,使用可接受的约定(1.5 为 54,2.5 为 118...)。
    【解决方案2】:

    使用 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...

    【讨论】:

    • 感谢@Paul W!这个周末我会试试看。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多