Страницы

Поиск по вопросам

воскресенье, 30 июня 2019 г.

Чтение тегов MP3 без использования сторонних библиотек

Я видел много статей о том как читать теги 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); }

Комментариев нет:

Отправить комментарий