我正在尝试从 MP3 文件中获取 BPM 属性:
根据这个问题,我可以看到如何在 Windows Store App 中执行此操作:
如何在 Windows 商店应用程序 C# 中读取 mp3 文件的 Beats-per-minute 标签?
但看不到如何Windows.Storage
在 Windows 窗体应用程序中使用。(如果我理解正确,那是因为Windows.Storage
特定于 UWP。)
如何在表单应用程序中阅读此内容?如果没有原生库,很高兴使用(希望是免费的)库。
我正在尝试从 MP3 文件中获取 BPM 属性:
根据这个问题,我可以看到如何在 Windows Store App 中执行此操作:
如何在 Windows 商店应用程序 C# 中读取 mp3 文件的 Beats-per-minute 标签?
但看不到如何Windows.Storage
在 Windows 窗体应用程序中使用。(如果我理解正确,那是因为Windows.Storage
特定于 UWP。)
如何在表单应用程序中阅读此内容?如果没有原生库,很高兴使用(希望是免费的)库。
为此,您可以使用 Windows 的Scriptable Shell Objects。item 对象有一个ShellFolderItem.ExtendedProperty方法
您所追求的属性是名为System.Music.BeatsPerMinute的官方 Windows 属性
所以,这里是你如何使用它(你不需要引用任何东西,这要归功于dynamic
COM 对象的酷 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);
}
有一个版本TagLib已移植到可移植类库 (PCL) 版本,Windows 窗体可以引用该版本并用于提取该信息。
我引用了 PCL 版本TagLib#.Portable,可通过 TagLib.Portable 上的Nuget 获得
从那里打开文件并读取所需信息的简单问题。
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;
}
}