我正在尝试从一个MP3文件中获取BPM属性:
我可以看到如何在Windows商店应用程序中执行此操作,如下面这个问题所示:
如何在Windows Forms应用程序C#中读取MP3文件的Beats-per-minute标签?
但是我不知道如何在Windows Forms应用程序中使用Windows.Storage
。(如果我正确理解,那是因为Windows.Storage
是特定于UWP的。)
如果没有本地功能,则该如何在窗体应用程序中读取此内容? 愿意使用(希望是免费的)库。
我正在尝试从一个MP3文件中获取BPM属性:
我可以看到如何在Windows商店应用程序中执行此操作,如下面这个问题所示:
如何在Windows Forms应用程序C#中读取MP3文件的Beats-per-minute标签?
但是我不知道如何在Windows Forms应用程序中使用Windows.Storage
。(如果我正确理解,那是因为Windows.Storage
是特定于UWP的。)
如果没有本地功能,则该如何在窗体应用程序中读取此内容? 愿意使用(希望是免费的)库。
你可以使用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);
}
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;
}
}