AGB  ·  Datenschutz  ·  Impressum  







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

Lauftext arbeitet nicht korrekt

Ein Thema von Nils_13 · begonnen am 24. Jul 2006 · letzter Beitrag vom 25. Jul 2006
Antwort Antwort
Seite 2 von 2     12   
Nils_13

Registriert seit: 15. Nov 2004
2.647 Beiträge
 
#11

Re: Lauftext arbeitet nicht korrekt

  Alt 25. Jul 2006, 07:42
Delphi-Quellcode:
function TfrmMain.ReadID3Tag(FileName: String): TID3Tag;
var
  FS: TFileStream;
  Buffer: array [1..128] of Char;
begin
  FS := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
  try
    FS.Seek(-128, soFromEnd);
    FS.Read(Buffer, 128);

    Result.ID := Copy(Buffer, 1, 3);
    Result.Titel := Copy(Buffer, 4, 30);
    Result.Artist := Copy(Buffer, 34, 30);
    Result.Album := Copy(Buffer, 64, 30);
    Result.Year := Copy(Buffer, 94, 4);
    Result.Comment := Copy(Buffer, 98, 30);
    Result.Genre := Ord(Buffer[128]);
    Result.FileName := FileName;
  finally
    FS.Free;
  end;
end;
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.755 Beiträge
 
Delphi 10.4 Sydney
 
#12

Re: Lauftext arbeitet nicht korrekt

  Alt 25. Jul 2006, 07:48
Mit Deinem ReadID3Tag kannst Du nur ID3V1 korrekt lesen.
Wenn ein mp3 File mit ID3V3 Tags daher kommt liest Du Datenmüll ein.

Du solltest zumindest vorher prüfen, ob ein ID3V1 Tag vorliegt.

Code:
Offset Länge Bedeutung
0 3 Kennung "TAG" zur Kennzeichnung eines ID3v1-Blocks
3 30 Songtitel
33 30 Künstler/Interpret
63 30 Album
93 4 Erscheinungsjahr
97 30 Beliebiger Kommentar
127 1 Genre
Oder die Werte, die Du dem Record übergibts, überprüfst
ob sie denn lesbare AsciiZeichen beinhalten.

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Nils_13

Registriert seit: 15. Nov 2004
2.647 Beiträge
 
#13

Re: Lauftext arbeitet nicht korrekt

  Alt 25. Jul 2006, 07:51
Und wie kann ich so etwas überprüfen ?

Dein Code oben liest die Id3TagsV2 ein und meiner 1, also muss ich rausfinden, welche Version in der Datei steht und mit dem passenden Code auslesen. Stimmt das so ?

*** edit ***
Warum stehen dann aber die Id3Tags bei den selben Dateien in der Playlist ohne Datenmüll ? In der Playlist: Static-X - The Only
Lauftext: Static-X #0#0#0#0#0#0#0#0#0#0#0#0 - The Only #0#0#0#0#0#0#0#0#0#0#0#0
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.755 Beiträge
 
Delphi 10.4 Sydney
 
#14

Re: Lauftext arbeitet nicht korrekt

  Alt 25. Jul 2006, 07:57
ID3v1 -> 0 3 Kennung "TAG" zur Kennzeichnung eines ID3v1-Blocks
hat in den ersten 3 Bytes das Wort "TAG" stehen.
Steht aber auch in dem Link den ich im obigen Beitrag erwähnt habe.

Warum in der Playlist alles korrekt zu lesen ist,
da steht auch für mich ein großes ?.

Vielleich spielt das etwas von PChar und String hinein.
bei PChar wird das Textende mit #0 definiert und wird in einem
String nicht dargestellt.

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#15

Re: Lauftext arbeitet nicht korrekt

  Alt 25. Jul 2006, 08:11
Hallo Nils,

Result.Artist := Copy(Buffer, 34, 30); du liest mit Copy() einen festen Bereich aus einer Struktur in einen String fester Länge. In Buffer ist Artist aber ein array of byte, welches rechts mit low values (#0) aufgefüllt wird. Du musst also anders vorgehen:

Delphi-Quellcode:
function BufToStr(buf: PChar; maxSize: Integer): String;
begin
  SetLength(Result, maxSize);
  Move(buf^, Result[1], maxSize);
  Result := StrPas(@Result[1]);
end;
Grüße vom marabu
  Mit Zitat antworten Zitat
Nils_13

Registriert seit: 15. Nov 2004
2.647 Beiträge
 
#16

Re: Lauftext arbeitet nicht korrekt

  Alt 25. Jul 2006, 08:33
Danke, ich habe es jetzt so gelöst:
Delphi-Quellcode:
type
  TID3Tag = record
    ID: array[0..3] of Char;
    Titel: array[0..30] of Char;
    Artist: array[0..30] of Char;
    Album: array[0..30] of Char;
    Year: array[0..4] of Char;
    Comment: array[0..30] of Char;
    Genre: Byte;
    Filename: String;
  end;

function ReadID3Tag(const FileName: String): TID3Tag;
begin
  FillChar(Result, SizeOf(Result), 0);
  with TFileStream.Create(FileName, fmOpenRead or fmShareDenyNone) do
  try
    Position := Size - 128;
    Read(Result.ID, 3);
    Read(Result.Titel, 30);
    Read(Result.Artist, 30);
    Read(Result.Album, 30);
    Read(Result.Year, 4);
    Read(Result.Comment, 30);
    Read(Result.Genre, 1);
    Result.Filename := Filename;
  finally
    Free;
  end;
end;
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 13:51 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