AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

ID3v1.1

Ein Thema von StanY · begonnen am 6. Jan 2005 · letzter Beitrag vom 6. Jan 2005
Antwort Antwort
StanY

Registriert seit: 5. Aug 2004
145 Beiträge
 
#1

ID3v1.1

  Alt 6. Jan 2005, 13:51
Kann mir einer sagen, warum bei diesem Code bei jeder Variable der erste Buchstabe fehlt und wie ich es beheben kann?

Delphi-Quellcode:
type
  TID3v1Tag = record // (ID3v1.1)
                           // Länge in Bytes
    Id: String[3]; // 3
    Title: String[30]; // 30
    Interpret: String[30]; // 30
    Album: String[30]; // 30
    Year: String[4]; // 4
    Comment: String[29]; // 29
    Track: String[1]; // 1
    Genre: String; // 1
                           // = 128
  end;

{ ... }

procedure TMp3Info.ReadID3v1Tag();
var
  tByte: Byte;
  F: TFileStream;
begin
  F := TFileStream.Create(Path+Name,fmOpenRead);
  if (F <> nil) then begin
    try
      F.Seek(-128,soFromEnd);
      F.Read(ID3v1Tag.Id,3);
      F.Read(ID3v1Tag.Title,30);
      F.Read(ID3v1Tag.Interpret,30);
      F.Read(ID3v1Tag.Album,30);
      F.Read(ID3v1Tag.Year,4);
      F.Read(ID3v1Tag.Comment,29);
      F.Read(ID3v1Tag.Track,1);
      F.Read(tByte,1);
      ID3v1Tag.Genre := cID3V1GENRE[tByte];
    finally
      F.Free;
    end;
  end;
end;
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#2

Re: ID3v1.1

  Alt 6. Jan 2005, 14:12
Moin!

Zitat von StanY:
Kann mir einer sagen, warum bei diesem Code bei jeder Variable der erste Buchstabe fehlt und wie ich es beheben kann?
Ja, ich kann's:

Du definierst hier ShortStrings und diese haben im Byte 0 (Index 0) immer ein Längenbyte welches die Länge des Strings angibt. Daher fehlt der erste Buchstabe, der wird ins Längenbyte geschrieben. Ausserdem hast du noch einen Fehler in der Definition von Genre: Das ist ein AnsiString und daher 4 Byte gross. Genauso ist dein "Track" 2 Zeichen gross (Längenbyte + 1 Datenbyte) und folglich sind auch alle deine anderen Strings ein Zeichen länger. Abhilfe schafft hier nur, entweder die Strings einzelnd auzulesen anstatt den Record als komplettes oder du liest den Record auf einmal aus, dann musst du aber die Strings als Array[1..xx] Of Char definieren.

Delphi-Quellcode:
type
  TID3v1Tag = record // (ID3v1.1)
                                     // Länge in Bytes
    Id: Array[0..2] Of Char; // 3 "TAG"
    Title: Array[0..29] Of Char; // 30
    Interpret: Array[0..29] Of Char; // 30
    Album: Array[0..29] Of Char; // 30
    Year: Array[0..3] Of Char; // 4
    Comment: Array[0..27] Of Char; // 28
    ID3v11_ID: Byte; // 1 (muss 0 sein und folgender > 0, dann ist es ID3v1.1)
    Track: Byte; // 1 (wenn eins von beiden nicht stimmt, dann ist es ID3v1.0 und wahrscheinlich noch Comment)
    GenreID: Byte; // 1
                                     // = 128

    Genre: String; // 4 - aber egal - kommt nicht in die Datei und hat da auch nix zu suchen
  end;

{ ... }

procedure TMp3Info.ReadID3v1Tag();
var
  tByte: Byte;
  F: TFileStream;
begin
  F := TFileStream.Create(Path+Name,fmOpenRead);
  if (F <> nil) then begin
    try
      F.Seek(-128,soFromEnd);
      F.Read(ID3v1Tag, 128); // durch den angehängen Genre String direkt 128 angegeben
      ID3v1Tag.Genre := cID3V1GENRE[ID3v1Tag.GenreID];
    finally
      F.Free;
    end;
  end;
end;
Ansonsten, mit deinem einzelnd auslesen müsstest du das erste Zeichen als Ziel angeben bzw. als Puffer:

Delphi-Quellcode:
procedure TMp3Info.ReadID3v1Tag();
var
  tByte: Byte;
  F: TFileStream;
begin
  F := TFileStream.Create(Path+Name,fmOpenRead);
  if (F <> nil) then begin
    try
      F.Seek(-128,soFromEnd);
      F.Read(ID3v1Tag.Id[1],3);
      F.Read(ID3v1Tag.Title[1],30);
      F.Read(ID3v1Tag.Interpret[1],30);
      F.Read(ID3v1Tag.Album[1],30);
      F.Read(ID3v1Tag.Year[1],4);
      F.Read(ID3v1Tag.Comment[1],29);
      F.Read(ID3v1Tag.Track[1],1);
      F.Read(tByte,1);
      ID3v1Tag.Genre := cID3V1GENRE[tByte];
    finally
      F.Free;
    end;
  end;
end;
//EDIT: Fehler in Kommentar beseitigt

MfG
Muetze1
  Mit Zitat antworten Zitat
6. Jan 2005, 14:16
Dieses Thema wurde von "Daniel" von "Object-Pascal / Delphi-Language" nach "Multimedia" verschoben.
StanY

Registriert seit: 5. Aug 2004
145 Beiträge
 
#4

Re: ID3v1.1

  Alt 6. Jan 2005, 14:52
Vielen Dank. Funktioniert hervorragend.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:45 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz