如何在 Windows Forms App 中获取 MP3 文件的 BPM 属性

How can I get the BPM property of an MP3 file in a Windows Forms App

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

我可以根据这个问题在 Windows 商店应用程序中看到如何做到这一点:

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

如何在表单应用程序中阅读此内容?如果没有原生的东西,很高兴使用(希望是免费的)库。

有一个版本 TagLib 被移植到可移植 class 库 (PCL) 版本,可以被 Windows 表格并用于提取该信息。

我引用了 PCL 版本 TagLib#.Portable which is available via Nuget at 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;
    }
}

您可以使用 Windows' Scriptable Shell Objects。 item 对象有一个 ShellFolderItem.ExtendedProperty 方法

您要找的 属性 是一位名叫 System.Music.BeatsPerMinute

的官员 Windows 属性

所以,下面是您如何使用它(您不需要引用任何东西,多亏了 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);
}