Как получить свойство BPM файла MP3 в приложении Windows Forms

Я пытаюсь получить свойство BPM из файла MP3:

Я могу видеть, как сделать это в приложении Магазина Windows согласно этому вопросу:

Как прочитать метки ударов в минуту mp3-файла в приложениях магазина Windows C#?

но не вижу, как использовать Windows.Storage в приложении Windows Forms. (Если я правильно понимаю, это потому, что Windows.Storage специфично для UWP.)

Как я могу прочитать это в приложении Forms? Рад использовать (надеюсь бесплатную) библиотеку, если нет ничего нативного.

2 ответа

Решение

Для этого вы можете использовать Windows Scriptable Shell Objects. Объект item имеет метод ShellFolderItem.ExtendedProperty

Свойство, которое вы ищете, является официальным свойством Windows с именем System.Music.BeatsPerMinute

Итак, вот как вы можете использовать его (вам не нужно ничего ссылаться, благодаря крутой dynamic Синтаксис C# для объектов COM):

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);
}

Существует версия TagLib, которая была перенесена в версию переносимой библиотеки классов (PCL), на которую может ссылаться Windows Forms и которая используется для извлечения этой информации.

Я ссылался на версию PCL TagLib#.Portable, которая доступна через Nuget на 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;
    }
}
Другие вопросы по тегам