ID3: Die Informationen in den mp3s

Im Zusammenhang mit einem kleinen Tool, dass die Informationen "Title" und "Artist" aus mp3s benötigt, habe ich mich
ein bisschen mit den ID3-Tags beschäftigt.
Die Funktionen, die man im Internet findet, kommen meist nur mit ID3v1 klar, obwohl es mitlerweile schon ID3v2.4.0
gibt. Außerdem überprüfen sie meistens nicht, ob die Datei überhautpt ein ID3-Tag enthält.
Ich habe daher eigene Funktionen geschrieben, die ich hier zur Verfügung stelle:

function ID3v2(Filename: string): Boolean;
var
  S: TFileStream;
  B: array [0..9of Byte;
begin
  S:=TFileStream.Create(Filename, fmOpenRead);
  S.Read(B,SizeOf(B));
  S.Free;
  Result:=((B[0]=$49)and(B[1]=$44)and(B[2]=$33)and(B[3]<$FF)and(B[4]<$FF)
    and(B[6]<$80)and(B[7]<$80)and(B[8]<$80)and(B[9]<$80));
end;

Diese Funktion überprüft, ob die Datei einen ID3v2-Header enthält. Die Funktion zum Auslesen ist aufgrund der größeren Flexibilität des Formats wesentlich komplexer. Im Augenblick bin ich zu faul die Funktionen aufzubereiten und zu erklären. Für weiterführende Informationen zu dem Format kann ich nur id3.org empfehlen.

function ID3v1(Filename: string): Boolean;
var
  S: TFileStream;
  B: array [1..3of Char;
begin
  S:=TFileStream.Create(Filename, fmOpenRead);
  S.Seek(-128,soFromEnd);
  S.Read(B,SizeOf(B));
  S.Free;
  Result:=(copy(B,1,3)='TAG');
end;

Das ist die Entsprechung für ID3v1-Tags. Ein Unterschied zwischen ID3v1 und ID3v1.1 gibt es hier nicht.
type
  ID3v11Tag = record
    Title: string[30];
    Artist: string[30];
    Album: string[30];
    Year: string[4];
    Comment: string[30];
    Track: Byte;
    Genre: Byte;
  end;
  
function GetID3v11Tag(Filename: string): ID3v11Tag;
var
  S: TFileStream;
  B: array [1..128of Char;
  i: Integer;
begin
  S:=TFileStream.Create(Filename, fmOpenRead);
  S.Seek(-SizeOf(B),soFromEnd);
  S.Read(B,SizeOf(B));
  Result.Title:=copy(B,4,30);
  Result.Artist:=copy(B,34,30);
  Result.Album:=copy(B,64,30);
  Result.Year:=copy(B,94,4);
  Result.Comment:=copy(B,98,30);
  if (Ord(B[126])=0)and(Ord(B[127])<>0then //ID3v1.1?
    Result.Track:=Ord(B[127])
  else
    Result.Track:=0;
  Result.Genre:=Ord(B[128]);
  S.Free;
end;

Und das ist die Funktion zum Auslesen der Informationen. Der Unterschied zwischen ID3v1 und ID3v1.1 besteht
in der Eigenschaft "Track". Die Funktion überprüft, um welche Version es sich handelt und gibt für "Track"
0 zurück, wenn es sich um einen ID3v1-Tag handelt.

Ihr könnt die Funktionen gerne verwenden und verändern. Wenn ihr sie so, wie sie hier sind, oder in veränderter
Form veröffentlichen wollt, linkt doch bitte auf diese Seite.
Fragen beantworte ich gerne hier im Forum oder auf dsdt.info (Da gibt es auch viele andere Programmierer, die euch sicherlich
weiterhelfen können)