Получить значение "исходного ключа" из файла .mp3 - PullRequest
2 голосов
/ 04 июля 2019

Я не могу найти способ прочитать свойство "исходный ключ" из mp3-файла, чтобы использовать информацию о песне в моем приложении.

Я уже пытался найтибиблиотеки, которые делают эту работу за меня.Я нашел TagLib # , который является очень хорошим решением для получения тегов / свойств различных форматов файлов.(включая mp3).

Я могу использовать эту библиотеку, чтобы получить название, исполнителя, количество ударов в минуту и ​​т. д. для моего использования отсутствует только начальное значение ключа, которое, к сожалению, отсутствует.

Я также пытался найти другие решения, которые поддерживают свойство начального ключа, но я не нашел его.

Я уже нашел источник, который, похоже, решает ту же проблему, ирешает это с помощью TagLib #, но я не могу понять, как он решил эту проблему. Используйте Ctrl + F и найдите «Initial», чтобы найти блок кода. Вы можете найти ссылку здесь

Я выложу короткую частьмоего кода, который можно использовать для определения различной информации об одной песне в шаблоне, например: (["bpm"] "title" - "artist")

    var file = TagLib.File.Create(filePath);
    return $"[{file.Tag.BeatsPerMinute}]{file.Tag.Title} - {file.Tag.FirstPerformer}";

Спасибо за любую помощь или рекомендации взаранее!:)

Ответы [ 3 ]

0 голосов
/ 05 июля 2019

Просто заимствовать код у nuget: mono TaglibSharp :

var tfile = TagLib.File.Create(@"..");
string initialKey = null;

if (tfile.GetTag(TagTypes.Id3v2) is TagLib.Id3v2.Tag id3v2)
{
    /*
    // test: add custom Initial Key tag 
    var frame = TextInformationFrame.Get(id3v2, "TKEY", true);
    frame.Text = new[] {"qMMM"};
    frame.TextEncoding = StringType.UTF8;
    tfile.Save();
    */

    var frame = TextInformationFrame.Get(id3v2, "TKEY", false);         
    initialKey = frame?.ToString();
}
0 голосов
/ 05 июля 2019

Попробуйте это:

public static void Main(string[] args)
{
    var path = …
    var file = TagLib.File.Create (path);
    var id3tag = (TagLib.Id3v2.Tag)file.GetTag (TagTypes.Id3v2);
    var key = ReadInitialKey (id3tag);
    Console.WriteLine ("Key = " + key);
}

static string ReadInitialKey(TagLib.Id3v2.Tag id3tag)
{
    var frame = id3tag.GetFrames<TextInformationFrame>().Where (f => f.FrameId == "TKEY").FirstOrDefault();
    return frame.Text.FirstOrDefault() ;
}

В Windows 10 вы также можете использовать:

async Task<string> ReadInitialKey(string path)
    {
        StorageFile file = await StorageFile.GetFileFromPathAsync(path);
        Windows.Storage.FileProperties.MusicProperties musicProperties = await file.Properties.GetMusicPropertiesAsync();
        var props = await musicProperties.RetrievePropertiesAsync(null);
        var inkp = props["System.Music.InitialKey"];
        return (string)inkp;
    }

См. здесь для документации по объекту MusicProperties и здесь для действительных свойств музыки.

0 голосов
/ 05 июля 2019

Вы можете использовать оболочку для чтения всех свойств MP3.

Тест на Windows 10, VS 2015 =>

// Add Reference Shell32.DLL
string sFolder = "e:\\";
string sFile= "01. IMANY - Don't Be so Shy (Filatov & Karas Remix).mp3";
List<string> arrProperties = new List<string>();
Shell objShell = new Shell();
Folder objFolder;
objFolder = objShell.NameSpace(sFolder);
int nMaxProperties = 332;
for (int i = 0; i < nMaxProperties; i++)
{
    string sHeader = objFolder.GetDetailsOf(null, i);
    arrProperties.Add(sHeader);
}
FolderItem objFolderItem = objFolder.ParseName(sFile);
if (objFolderItem != null)
{
    for (int i = 0; i < arrProperties.Count; i++)
    {
        Console.WriteLine((i + ('\t' + (arrProperties[i] + (": " + objFolder.GetDetailsOf(objFolderItem, i))))));
    }
}
...