![]() |
ID3v1.1
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; |
Re: ID3v1.1
Moin!
Zitat:
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:
Ansonsten, mit deinem einzelnd auslesen müsstest du das erste Zeichen als Ziel angeben bzw. als Puffer:
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;
Delphi-Quellcode:
//EDIT: Fehler in Kommentar beseitigt
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; MfG Muetze1 |
DP-Maintenance
Dieses Thema wurde von "Daniel" von "Object-Pascal / Delphi-Language" nach "Multimedia" verschoben.
|
Re: ID3v1.1
Vielen Dank. Funktioniert hervorragend.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:31 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz