如何在Windows Forms应用程序中获取MP3文件的BPM属性

10

我正在尝试从一个MP3文件中获取BPM属性:

在此输入图片描述

我可以看到如何在Windows商店应用程序中执行此操作,如下面这个问题所示:

如何在Windows Forms应用程序C#中读取MP3文件的Beats-per-minute标签?

但是我不知道如何在Windows Forms应用程序中使用Windows.Storage。(如果我正确理解,那是因为Windows.Storage是特定于UWP的。)

如果没有本地功能,则该如何在窗体应用程序中读取此内容? 愿意使用(希望是免费的)库。


BPM并不总是记录在元数据中,有时需要进行计算。您是想要:1)从音频中计算BPM;2)读取所有文件类型的通用元数据;3)读取MP3文件上的ID3v2标签;4)读取与Windows资源管理器相同的元数据。 - Brad
4 - 我不担心计算bpm,因为这些曲目已经在商业软件(RekordBox或Serato DJ)中进行了分析。我只需要能够获取该值即可。 - Ben
我猜你正在寻找这个 https://dev59.com/qJjga4cB1Zd3GeqPFRlr? - Tarun Lalwani
2个回答

10

你可以使用Windows的可脚本化Shell对象来实现这一点。 该项对象具有一个ShellFolderItem.ExtendedProperty方法

你需要的属性是一个官方的Windows属性,名为System.Music.BeatsPerMinute

所以,这里是如何使用它(由于COM对象的酷炫dynamic C#语法,你不需要引用任何东西):

static void Main(string[] args)
{
    string path = @"C:\path\kilroy_was_here.mp3";

    // instantiate the Application object
    dynamic shell = Activator.CreateInstance(Type.GetTypeFromProgID("Shell.Application"));

    // get the folder and the child
    var folder = shell.NameSpace(Path.GetDirectoryName(path));
    var item = folder.ParseName(Path.GetFileName(path));

    // get the item's property by it's canonical name. doc says it's a string
    string bpm = item.ExtendedProperty("System.Music.BeatsPerMinute");
    Console.WriteLine(bpm);
}

您,先生,是一个传奇。 - Ben

2
有一个版本的 TagLib 被移植到了可移植类库(PCL)版本,可以被 Windows Forms 引用并用于提取信息。
我引用了可通过 Nuget 获取的 PCL 版本 TagLib#.Portable,链接为 TagLib.Portable
从那里,只需简单地打开文件并读取所需信息即可。
class Example {

    public void GetFile(string path) {
        var fileInfo = new FileInfo(path);
        Stream stream = fileInfo.Open(FileMode.Open);
        var abstraction = new TagLib.StreamFileAbstraction(fileInfo.Name, stream, stream);
        var file = TagLib.File.Create(abstraction);//used to extrack track metadata

        var tag = file.Tag;

        var beatsPerMinute = tag.BeatsPerMinute; //<--

        //get other metadata about file

        var title = tag.Title;
        var album = tag.Album;
        var genre = tag.JoinedGenres;
        var artists = tag.JoinedPerformers;
        var year = (int)tag.Year;
        var tagTypes = file.TagTypes;

        var properties = file.Properties;
        var pictures = tag.Pictures; //Album art
        var length = properties.Duration.TotalMilliseconds;
        var bitrate = properties.AudioBitrate;
        var samplerate = properties.AudioSampleRate;
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接