Я видел много статей о том как читать теги mp3 с помощью разных библиотек. Есть ли способ сделать это без их использования? Если можете, поделитесь кодом пожалуйста.
Ответ
В библиотеке .NET нет стандартных классов для работы с тегами ID3. Для того, чтобы сделать, что Вы хотите, Вам нужно самим реализовать спецификацию ID3V2 - там 2 документа: "Main Structure" и "Native Frames". В принципе, ничего сложного там нет, но очень много и нудно, поэтому чтобы не городить велосипедов проще взять что-то готовое - например библиотеку taglib-sharp
Если же Вы всё-таки хотите поковыряться в этом сами, а переводить официальную спецификацию не хочется или сложно, то я в свое время переводил её для себя (ID3v2.4.0-russian-translate). Правда повторюсь, переводил для себя, этот перевод нельзя использовать как официальный и абсолютно достоверный.
Помимо тега id3v2 в файле mp3 может храниться тег id3v1. Он ущербен, устарел и имеет ряд ограничений, но в некоторых случаях может быть полезен и реализует в 10 строк.
Ограничения тега id3v1:
На поля отводится фиксированное, малое количество символов
Кодировка только в ISO 8859-1
Малое количество полей
Черновая реализация:
public class Id3v1
{
private const string TAGID = "TAG";
private byte[] tagid = new byte[3];
private byte[] title = new byte[30];
private byte[] artist = new byte[30];
private byte[] album = new byte[30];
private byte[] year = new byte[4];
private byte[] comment = new byte[28];
private byte[] genre = new byte[1];
private byte[] bitrate = new byte[1];
private byte[] duration = new byte[1];
public string Title
{
get
{
return Encoding.Default.GetString(title).TrimEnd('\0');
}
}
public string Artist
{
get
{
return Encoding.Default.GetString(artist).TrimEnd('\0');
}
}
public string Album
{
get
{
return Encoding.Default.GetString(album).TrimEnd('\0');
}
}
public string Year
{
get
{
return Encoding.Default.GetString(year).TrimEnd('\0');
}
}
public string Comment
{
get
{
return Encoding.Default.GetString(comment).TrimEnd('\0');
}
}
public byte Genre
{
get
{
return genre[0];
}
}
public string Bitrate
{
get
{
return Encoding.Default.GetString(bitrate).TrimEnd('\0');
}
}
public string Duration
{
get
{
return Encoding.Default.GetString(duration).TrimEnd('\0');
}
}
public Id3v1(string filename)
{
using (FileStream fs = new FileStream(filename, FileMode.Open))
{
fs.Seek(-128, SeekOrigin.End);
fs.Read(tagid, 0, tagid.Length);
//Проверка наличие тега по заголовку "TAG" в начале
if (Encoding.Default.GetString(tagid) == TAGID)
{
fs.Read(title, 0, title.Length);
fs.Read(artist, 0, artist.Length);
fs.Read(album, 0, album.Length);
fs.Read(year, 0, year.Length);
fs.Read(bitrate, 0, bitrate.Length);
fs.Read(duration, 0, duration.Length);
fs.Read(comment, 0, comment.Length);
fs.Read(genre, 0, genre.Length);
}
else
{
throw new NoId3v1Exception();
}
}
}
}
Пример использования:
public void ArtistTest()
{
string expArtist = "Sting";
Id3v1 id3 = new Id3v1("test.mp3");
Assert.AreEqual(expArtist, id3.Artist);
}
Комментариев нет:
Отправить комментарий