Einzelnen Beitrag anzeigen

Benutzerbild von Techcrawler
Techcrawler

Registriert seit: 14. Sep 2006
Ort: Neukirchen-Vluyn
40 Beiträge
 
Delphi 2006 Architect
 
#1

Codeprüfung/-vorschläge | Thema: MP3, ID-Infos

  Alt 20. Okt 2006, 08:48
Hi,
ich habe just for fun mal eine Unit zum extrahieren der ID-Infos aus MP3 Dateien geschrieben und es sieht so aus, als würde diese auch gut funktionieren.
Nun möchte ich gern mal das 'tausend-augen-prinzip' nutzen und euch mal bitten, dass ihr euch den Code mal anseht, ob da evtl. Fehler drin sind oder was ich noch verbessern kann. Das ganze bezieht sich bisher nur auf ID3v1 Tags, die ID3v2´s kommen später mit rein.
Ich danke allen, die sich die Mühe machen, im vorraus.
Der Delphicode ist die komplette .pas Datei.

Delphi-Quellcode:
unit mp3idvx;

interface

uses classes, SysUtils;

type
    TID3v1 = record
        Songtitel: string;
        Kuenstler: string;
        Album: string;
        Erscheinungsjahr: string;
        Kommentar: string;
        Genre: string;
    end;
    TMP3ID3vX = class
        private
        public
            function getID3v1Information(filenameWithPath: string; var ID3v1Infos: TID3v1): integer;
    end;

var
    clsMP3ID3vX: TMP3ID3vX;

implementation

function TMP3ID3vX.getID3v1Information(filenameWithPath: string; var ID3v1Infos: TID3v1): integer;
var
    fstream: TFileStream;
    buffer: string;
    i: integer;
begin
    // Stream öffnen
    fstream := TFileStream.Create(filenameWithPath,fmOpenRead or fmShareDenyNone);

    // Pufferlänge einstellen
    SetLength(buffer,128);

    // An den Anfang der ID3v1 Informationen gehen
    fstream.Seek(-128,soFromEnd);

    // 128 Bytes in den Puffer laden
    if (fstream.Read(buffer[1],128) < 128) then
    begin
        // Datenmenge reicht nicht für einlesen aus, Fehler
        result := -1;
        exit;
    end;

    // Freigeben des FileStreams, da nicht mehr benötigt
    fstream.Free;

    // Songtitel extrahieren
    ID3v1Infos.Songtitel := '';
    for i:=4 to 33 do
        ID3v1Infos.Songtitel := ID3v1Infos.Songtitel+buffer[i];

    // Künstler/Interpret extrahieren
    ID3v1Infos.Kuenstler := '';
    for i:=34 to 63 do
        ID3v1Infos.Kuenstler := ID3v1Infos.Kuenstler+buffer[i];

    // Albuminformationen extrahieren
    ID3v1Infos.Album := '';
    for i:=64 to 93 do
        ID3v1Infos.Album := ID3v1Infos.Album+buffer[i];

    // Erscheinungsjahr extrahieren
    ID3v1Infos.Erscheinungsjahr := '';
    for i:=94 to 97 do
        ID3v1Infos.Erscheinungsjahr := ID3v1Infos.Erscheinungsjahr+buffer[i];

    // Kommentar extrahieren
    ID3v1Infos.Kommentar := '';
    for i:=98 to 127 do
        ID3v1Infos.Kommentar := ID3v1Infos.Kommentar+buffer[i];

    // Genre extrahieren
    ID3v1Infos.Genre := buffer[128];

    // Alles okay, Rückgabe
    result := 0;
end;

end.
Wer das ganze mal testen möchte, braucht eine Form, einen Button und einen FileDialog (bei mir aus den Jedi Sachen, kann aber auch der Standartdialog sein), 6 Labels und einen Verweis auf die obige Unit.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
    mp3info: TID3v1;
begin
    if JvOpenDialog1.Execute then
    begin
        if (clsMP3ID3vX.getID3v1Information(JvOpenDialog1.FileName,mp3info) >= 0) then
        begin
            Label1.Caption := 'Songtitel: '+mp3info.Songtitel;
            Label2.Caption := 'Künstler/Interpret: '+mp3info.Kuenstler;
            Label3.Caption := 'Album: '+mp3info.Album;
            Label4.Caption := 'Erscheinungsjahr: '+mp3info.Erscheinungsjahr;
            Label5.Caption := 'Kommentar: '+mp3info.Kommentar;
            Label6.Caption := 'Genre: '+mp3info.Genre;
        end
        else begin
            MessageDlg('Es trat ein Fehler auf!', mtError, [mbOK], 0);
        end;
    end;
end;
  Mit Zitat antworten Zitat