Понедельник, 06.05.2024
Королевство Delphi
Главное меню
Статьи
Наш опрос
Как часто ви на этот сайт заходите?
Всего ответов: 159
Статистика
Онлайн всего: 1
Гостей: 1
Пользователей: 0
Форма входа
Главная » Статьи » Мультимедиа » Звук

Как прочитать ID3-Tag'и из MP3-файла?

На самом деле, как это не кажется, прочитать ID3-теги из MP3-файла совсем не сложно и, более того, для этого не требуется никаких специальных компонентов. 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 тегов.

Получить ссылку на материал

Категория: Звук | Добавил: Барон (20.12.2011)
Просмотров: 1479 | Теги: mp3, файл, ID3-Tag | Рейтинг: 0.0/0
[ Пожертвования для сайта ] [ Пожаловаться на материал ]

Если вам помог материал сайта кликните по оплаченной рекламе размещенной в центре

Поиск
Категории раздела
Звук [8]
Королевство Delphi © 2010-2024
Яндекс цитирования