Pagina1 van 1
Forum

Welkom bij de Tweaking4All gemeenschapsforums!
Voor je gaat deelnemen, bekijk de Forum Regels!

Specifieke onderwerpen: Start het onderwerp met de naam van het programma of systeem.
Bijvoorbeeld “MacOS X – Jouw vraag“, of bijvoorbeeld “MS Word – Jouw Tip of Truc“.

Merk op: Omschakelen naar een andere taal zal niet werken als je een post aan het lezen bent aangezien er waarschijnlijk geen vertaling beschikbaar is.



Deel:
Meldingen
Alles wissen

[Opgelost] Pascal - Hoe lees/schrijf je MP3 ID3 tags?

1 Berichten
1 Gebruikers
0 Reactions
1,300 Bekeken
 Hans
(@hans)
Famed Member Admin
Deelgenomen: 12 jaar geleden
Berichten: 2864
Topic starter  

Het mooie van MP3 muziek is (behalve dat ze compact zijn natuurlijk) het gebruik van de zogenaamde ID3 tags. Hier wat voorbeeld code hoe je dit kunt lezen en zelfs schrijven. Veel plezier!

De ID3 tag wordt opgeslagen in de laatste 128 bytes van een MPEG Layer 3 file en begint met het trefwoord “TAG” als string. Als je "TAG" niet kunt vinden dan is er geen ID3 info.

In nieuwere versies van Delphi kun je het beste packed keyword voor arrays en records gebruiken.

The MPEG Layer 3 ID3 tag structuur:

 ID3Struct = record
   Signature: array[0..2] of Char; { Should be: "TAG" }
   Title,
   Artist,
   Album: array[0..29] of Char;
   Year: array[0..3] of Char;
   Comment: array[0..29] of Char;
   Genre: Byte;
 end;

Alle genres (Max. 256).

 ID3Genre: array[0..126] 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', 'AlternRock', 'Bass', 'Soul', '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 American',
   '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', 'Rhythmic Soul', 'Freestyle',
   'Duet', 'Punk Rock', 'Drum Solo', 'Acapella', 'Euro-House', 'Dance Hall'
 );

Code voor het lezen van de ID3 tags:

procedure ReadID3(sFilename:string);
var
 fMP3: file of Byte;
 Tag: ID3Struct;
begin
 try
   (* sFileName - (string) The full file name with path. *)
   AssignFile(fMP3, sFileName);
   Reset(fMP3);
   try
     Seek(fMP3, FileSize(fMP3) - 128);
     BlockRead(fMP3, Tag, SizeOf(Tag));
   finally
   end;
 finally
   CloseFile(fMP3);
 end;
 if fMP3.Signature<> 'TAG' then begin
   ...
   { Doesn't have an ID3 tag }
 end else begin
   ...
   { Do something with the tag }
 end;
end;

En voor het schrijven van ID3 tags:

(* WriteID3Tag() function
**
** Copyright (c) 2000 Jacob Dybala (m3Rlin)
** Freeware.
** Modified: January 7 2000
** Please leave this copyright notice.
*)
procedure WriteID3Tag(id3NewTag: ID3Struct; sFileName: string);
var
 fMP3: file of Byte;
 Tag : ID3Struct;
begin
 try
   AssignFile(fMP3, sFileName);
   Reset(fMP3);
   try
     Seek(fMP3, FileSize(fMP3) - ID3OffsetFromEnd);
     BlockRead(fMP3, Tag, SizeOf(Tag));
     if fMP3.Signature = 'TAG' then
       { Replace old tag }
       Seek(fMP3, FileSize(fMP3) - ID3OffsetFromEnd)
     else
       (* Append tag to file because it doesn't exist.
       * Cannot use Append() function. It's only for text files.
       *)
       Seek(fMP3, FileSize(fMP3));
     BlockWrite(fMP3, id3NewTag, SizeOf(id3NewTag));
   finally
   end;
 finally
   CloseFile(fMP3);
 end;
end;

   
BeantwoordenCiteren
Deel: