如何在 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);
}
我正在尝试从 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);
}