Як прочитати ID3-Tag “і з MP3-файл за допомогою Delphi?, Різне, Програмування, статті

Насправді, як це не здається, прочитати ID3-теги з MP3-файл за допомогою Delphi зовсім не складно і, більше того, для цього не потрібно ніяких спеціальних компонентів. TMediaPlayer тут також безсилий. Всі ID3-теги зберігаються в останніх 128-ми байтах MP3-файла. Частина з них записана не в тому вигляді, в якому ми звикли їх читати в Winamp або в іншому програвачі … Отже, перейдемо відразу до коду …


  Byte 1-3 = ID “TAG” 
  Byte 4-33 = Titel / Title 
  Byte 34-63 = Artist 
  Byte 64-93 = Album 
  Byte 94-97 = Jahr / Year 
  Byte 98-127 = Kommentar / Comment 
  Byte 128 = Genre 
}


Це – загальна схема зберігання інформації в MP3-файл, яку ми будемо читати. Вся ця інформація відокремлюється від “музичної” частини файлу символами “TAG”. Після них і починається службова інформація: назва композиції, виконавець, альбом, рік виконання, коментар, жанр. Буде набагато простіше працювати з ID3-тегами, оголосивши для них окремий тип: 
type 
  TID3Tag = record 
    ID: string[3]; 
    Titel: string[30]; 
    Artist: string[30]; 
    Album: string[30]; 
    Year: string[4]; 
    Comment: string[30]; 
    Genre: Byte; 
  end


Отже, ми оголосили тип TID3Tag і тепер можемо його використовувати. Як видно з коду, цей клас містить кілька строкових полів, в кожному з яких і буде записаний відповідний ID3-тег.


Тепер слід поговорити про теге, відповідаємо за жанр композиції. Справа в тому, що у файлі зберігається лише номер жанру, а не назва самого жанру, тому отримувати його назва доведеться вручну. Спочатку оголосимо масив, що містить назви всіх можливих жанрів. Всього їх 147:


const 
 Genres : array[0..146] of string = 
    (“Blues”,”Classic Rock”,”Country”,”Dance”,”Disco”,”Funk”,”Grunge”, 
    “Hip- Hop”,”Jazz”,”Metal”,”New Age”,”Oldies”,”Other”,”Pop”,”R&B”, 
    “Rap”,”Reggae”,”Rock”,”Techno”,”Industrial”,”Alternative”,”Ska”, 
    “Death Metal”,”Pranks”,”Soundtrack”,”Euro-Techno”,”Ambient”, 
    “Trip-Hop”,”Vocal”,”Jazz+Funk”,”Fusion”,”Trance”,”Classical”, 
    “Instrumental”,”Acid”,”House”,”Game”,”Sound Clip”,”Gospel”,”Noise”, 
    “Alternative Rock”,”Bass”,”Punk”,”Space”,”Meditative”,”Instrumental Pop”, 
    “Instrumental Rock”,”Ethnic”,”Gothic”,”Darkwave”,”Techno-Industrial”,”Electronic”, 
    “Pop-Folk”,”Eurodance”,”Dream”,”Southern Rock”,”Comedy”,”Cult”,”Gangsta”, 
    “Top 40″,”Christian Rap”,”Pop/Funk”,”Jungle”,”Native US”,”Cabaret”,”New Wave”, 
    “Psychadelic”,”Rave”,”Showtunes”,”Trailer”,”Lo-Fi”,”Tribal”,”Acid Punk”, 
    “Acid Jazz”,”Polka”,”Retro”,”Musical”,”Rock & Roll”,”Hard Rock”,”Folk”, 
    “Folk-Rock”,”National Folk”,”Swing”,”Fast Fusion”,”Bebob”,”Latin”,”Revival”, 
    “Celtic”,”Bluegrass”,”Avantgarde”,”Gothic Rock”,”Progressive Rock”, 
    “Psychedelic Rock”,”Symphonic Rock”,”Slow Rock”,”Big Band”,”Chorus”, 
    “Easy Listening”,”Acoustic”,”Humour”,”Speech”,”Chanson”,”Opera”, 
    “Chamber Music”,”Sonata”,”Symphony”,”Booty Bass”,”Primus”,”Porn Groove”, 
    “Satire”,”Slow Jam”,”Club”,”Tango”,”Samba”,”Folklore”,”Ballad”, 
    “Power Ballad”,”Rhytmic Soul”,”Freestyle”,”Duet”,”Punk Rock”,”Drum Solo”, 
    “Acapella”,”Euro-House”,”Dance Hall”,”Goa”,”Drum & Bass”,”Club-House”, 
    “Hardcore”,”Terror”,”Indie”,”BritPop”,”Negerpunk”,”Polsk Punk”,”Beat”, 
    “Christian Gangsta”,”Heavy Metal”,”Black Metal”,”Crossover”,”Contemporary C”, 
    “Christian Rock”,”Merengue”,”Salsa”,”Thrash Metal”,”Anime”,”JPop”,”SynthPop”); 
Нарешті, процедура, що читає все теги з MP3-файл … Пропишемо її в розділі implementation:



var 
  Form1: TForm1; 
implementation 
{$R *.dfm} 
function readID3Tag(FileName: string): TID3Tag; 
var 
  FS: TFileStream; 
  Buffer: array [1..128] of Char; 
begin 
  FS := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite); 
  try 
    FS.Seek(-128, soFromEnd); 
    FS.Read(Buffer, 128); 
    with Result do 
    begin 
      ID := Copy(Buffer, 1, 3); 
      Titel := Copy(Buffer, 4, 30); 
      Artist := Copy(Buffer, 34, 30); 
      Album := Copy(Buffer, 64, 30); 
      Year := Copy(Buffer, 94, 4); 
      Comment := Copy(Buffer, 98, 30); 
      Genre := Ord(Buffer[128]); 
    end
  finally 
    FS.Free; 
  end
end

Ця функція поверне нам весь вміст ID3-тегів MP3-файлу, вказаного в FileName. Тепер справа за малим – написати обробник відкриття файлу і читання вмісту всіх тегів з обраного файлу:
procedure TfrmMain.Button1Click(Sender: TObject); 
begin 
  if OpenDialog1.Execute then 
  begin 
    with readID3Tag(OpenDialog1.FileName) do 
    begin 
      LlbID.Caption := “ID: ” + ID; 
      LlbTitel.Caption := “Titel: ” + Titel; 
      LlbArtist.Caption := “Artist: ” + Artist; 
      LlbAlbum.Caption := “Album: ” + Album; 
      LlbYear.Caption := “Year: ” + Year; 
      LlbComment.Caption := “Comment: ” + Comment; 
      if (Genre >= 0) and (Genre <=146) then 
       LlbGenre.Caption := “Genre: ” + Genres[Genre] 
      else 
       LlbGenre.Caption := “N/A”; 
    end
  end
end

Ну от і все … Додайте відповідні компоненти на форму і випробуйте працездатність коду. В архіві з цією статтею є дана демо-програма.


Крім ID3 тегів (повне ім’я яких звучить як ID3v1), існують ID3v2-теги. Вони містять більшу кількість інформації: все ID3v1 теги, а також інформацію про авторські права, сьогодення виконавця, адресі в інтернеті, композитора та іншої інформації. Однак, ці теги не отримали широкого розповсюдження, тому вони в цій статті не розглядаються. Принцип їх читання той же, що і у ID3v1 тегів.

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*