Как получить свойство 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;
}
}