Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi ID3v1 und ID3v2 auslesen (https://www.delphipraxis.net/35314-id3v1-und-id3v2-auslesen.html)

CalganX 5. Dez 2004 14:18


ID3v1 und ID3v2 auslesen
 
Hi,
das Auslesen von Tags treibt mich noch in den Wahnsinn. :?
Mein Problem ist eigentlich recht simpel: ich will die ID3-Tags aus MP3-Dateien lesen. Das Problem ist nur, dass es manchmal v1.1 und manchmal v2 oder gar beides sein kann. Ich kann auch soweit erstere Version mit folgendem Source von hier:
Delphi-Quellcode:
type
  TID3Tag = record
   // diese Struktur erweitert die Char arrays um ein Zeichen für Nullterminator,
   // somit muß sie Feld für Feld gelesen und geschrieben werden, da ID3 eben diese Terminatoren NICHT speichert.
    ID: array[0..3] of Char;          
    Title: 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;                      
  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.Title, 30);
    Read(Result.Artist, 30);
    Read(Result.Album, 30);
    Read(Result.Year, 4);
    Read(Result.Comment, 30);
    Read(Result.Genre, 1);
  finally
    Free;
  end;
end;
Das Problem ist nun aber, dass ich bisher nichts gefunden habe, um die neuere Version auszulesen.
Hat jemand da was für mich?

Chris

tommie-lie 5. Dez 2004 14:23

Re: ID3v1 und ID3v2 auslesen
 
Die zweite Version ist nicht so einfach aufgebaut. Die Struktur findest du unter http://www.id3.org, wenn du es selber programmieren willst.
Ansonsten gibt es auf Torry sicherlich einige Komponenten, die auch ID3v2 lesen können, zumindest rudimentär. Alternativ habe ich im DF mal mein [df]"UltimaTag"[/df] vorgestellt, das ID3v1 und ID3v2 lesen und schreiben kann. ID3v2-Unterstützung ist zwar bei weitem noch nicht komplett, aber die Informationen, die auch ID3v1 enthält, sind fertig.
An einem kompletten Redesign von UltimaTag arbeite ich noch, zur Zeit gibt's Lese-Support für einige ID3v2-Frames, allerdings bisher ungetestet, schreibender Zugriff ist noch lange nicht fertig.

CalganX 5. Dez 2004 14:27

Re: ID3v1 und ID3v2 auslesen
 
Hi,
Zitat:

Zitat von tommie-lie
Die zweite Version ist nicht so einfach aufgebaut. Die Struktur findest du unter http://www.id3.org, wenn du es selber programmieren willst.

Daran dachte ich eigentlich. ;) Aber ich wollte nicht komplett ohne Source-Denkanstoß anfangen. :zwinker:

Zitat:

Zitat von tommie-lie
Ansonsten gibt es auf Torry sicherlich einige Komponenten, die auch ID3v2 lesen können, zumindest rudimentär. Alternativ habe ich im DF mal mein [df]"UltimaTag"[/df] vorgestellt, das ID3v1 und ID3v2 lesen und schreiben kann.

Das reicht mir völlig. :stupid:
Das Problem bei den Torry-Komponenten: die sind nicht D2005-Kompatibel. Und ich habe keine Lust wieder zwei Stunden daran zu sitzen ein D7-Paket auf D9 umzuschreiben. :?

Zitat:

Zitat von tommie-lie
ID3v2-Unterstützung ist zwar bei weitem noch nicht komplett, aber die Informationen, die auch ID3v1 enthält, sind fertig.

Reicht mir ebenfalls. Ich will nur Titel, Album und Interpret haben. ;)

Danke für den Hinweis. ;)
SourceCode lässt sich auch mit Notepad lesen. *g*

Chris

tommie-lie 5. Dez 2004 14:38

Re: ID3v1 und ID3v2 auslesen
 
Zitat:

Zitat von Chakotay1308
Das Problem bei den Torry-Komponenten: die sind nicht D2005-Kompatibel.

Meine sollte zumindest für den Win32-Teil funktionieren, weil's ja nur 'ne Klasse ist ;-)

Zitat:

Zitat von Chakotay1308
SourceCode lässt sich auch mit Notepad lesen. *g*

Welcher? Meiner? Klar, der ist ja auch mit'm Notepad geschrieben :mrgreen:

Robert Marquardt 5. Dez 2004 14:46

Re: ID3v1 und ID3v2 auslesen
 
Weicheier! Source schreibt man mit vi. :-D

tommie-lie 5. Dez 2004 14:48

Re: ID3v1 und ID3v2 auslesen
 
vi?!? dieser komische Editor, den keiner bedienen kann? Da bleibe ich doch lieber bei joe ;-)

CalganX 5. Dez 2004 15:19

Re: ID3v1 und ID3v2 auslesen
 
Hi,
klar. Deine Unit ist nahezu perfekt. Nur die Lizenz stört mich. :?
Das Projekt, was ich gerade schreibe sollte eigentlich nicht Freeware werden und die (L)GPL zwingt mich ja nahezu dazu, oder?

Chris

Joe ist ganz gut. Aber Vi finde ich besser. :tongue: Auf jedenfalls sind beide besser, als emacs. :kotz:

tommie-lie 5. Dez 2004 16:27

Re: ID3v1 und ID3v2 auslesen
 
Zitat:

Zitat von Chakotay1308
Nur die Lizenz stört mich. :?

Wieso? Ist die LPGL ;-)

Zitat:

Zitat von Chakotay1308
Das Projekt, was ich gerade schreibe sollte eigentlich nicht Freeware werden und die (L)GPL zwingt mich ja nahezu dazu, oder?

Jein. Freeware im Sinne von "kostenlos für jedermann" nicht, denn dein Programm würde bei statischer Linkung nur der LGPL unterliegen, d.h. du kannst das Programm auch in Objektcode und für eine entsprechende (finanzielle) Gegenleistung für die Übertragung des Programmes weitergeben. Dein Programm muss also nicht "free" sein, es muss nur unter der LGPL veröffentlich werden.
Bei einer dynamischen Linkung (kompilier' dir 'ne DLL mit Interface oder ein BPL ;-)) ist dein Programm lediglich eines, das meine Bibliothek benutzt, unterliegt also weder der GPL, noch der LGPL.

Allerdings bin ich der Urheber, habe also sämtliche Rechte an der Bibliothek, und wenn du lieb guckst (sehe ich da ein Delphi2005 in deinen Augen? :mrgreen:), räume ich dir eine Sonderlizensierung ein :zwinker:

Andererseits wolltest du doch sowieso nur einen Denkanstoß haben und dir den Code selber schreiben, dein Code wäre dann von dir zu lizensieren, unter jeder Lizenz die dir einfällt ;-)

CalganX 5. Dez 2004 16:39

Re: ID3v1 und ID3v2 auslesen
 
Hi,
okay. ;)
Ich denke sowieso, dass ich selber was schreiben muss, weil ich eigentlich das gerne direkt in meine Klasse einbauen möchte.

Naja, ich werde mir was einfallen lassen.
Danke für deine Hilfe,
Chris

Robert Marquardt 5. Dez 2004 16:58

Re: ID3v1 und ID3v2 auslesen
 
Wie waere es mit der JCL/JVCL? Zu Id3 v1 und v2 ist da auch etwas dabei.

CalganX 5. Dez 2004 17:06

Re: ID3v1 und ID3v2 auslesen
 
Hi,
aus zwei bzw. drei Gründen nehme ich im Moment nicht die JVCL: erstens habe ich keine Möglichkeit (lies Zeit) 15MB herunterzuladen (wg. ISDN) um dann unter Umständen festzustellen, dass es nicht richtig mit D2005 funktioniert und zweitens weil ich gerne auf jegliche Zusatzkomponenten/-bibliotheken verzichten möchte. ;)

Aber ansonsten habe ich nichts gegen die JVCL. Ich warte im Moment auf den 20. Dezember in der Hoffnung, dass dann die JVCL Version 3 fertig ist und ich mir relativ sicher sein kann, dass die 15MB sich gelohnt haben (die ich dann aber auch in der Schule runterladen werde). ;)

Chris

Muetze1 5. Dez 2004 21:02

Re: ID3v1 und ID3v2 auslesen
 
Moin!

In dem oben von dir verlinkten Beitrag habe ich auch auf meine ID3 Tag Lib verwiesen und diese kommt ohne Komponente aus sondern ist eine reine Klasse und du kannst es ja bei dir nutzen und es sollte Delphi 2005 kompatibel sein.

MfG
Muetze1

DelphiFreund 12. Dez 2004 19:36

Re: ID3v1 und ID3v2 auslesen
 
Hi Leute,
als ich gerade diesen Thread laß ist mir etwas aufgefallen.
@Chakotay1308: Diese Version:
Delphi-Quellcode:
type
  TID3Tag = record
   // diese Struktur erweitert die Char arrays um ein Zeichen für Nullterminator,
   // somit muß sie Feld für Feld gelesen und geschrieben werden, da ID3 eben diese Terminatoren NICHT speichert.
    ID: array[0..3] of Char;          
    Title: 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;                      
  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.Title, 30);
    Read(Result.Artist, 30);
    Read(Result.Album, 30);
    Read(Result.Year, 4);
    Read(Result.Comment, 30);
    Read(Result.Genre, 1);
  finally
    Free;
  end;
end;

funktionioniert nur bei ID3v1 Tags, es gibt aber schon seit langem die oft verwendete ID3v1.1. Du solltest auf jeden Fall die Funktion ausbauen, die Struktur ist folgende:
ID ('TAG')
Title 30
Artist 30
Album 30
Year 4
Comment 28
0-Byte ($0) 1
Album Track (Titelnummer) 1
Genre 1

die Zahlen sind natürlich in Byte.


Gruß DelphiFreund

tommie-lie 12. Dez 2004 19:41

Re: ID3v1 und ID3v2 auslesen
 
Aber nicht immer wird v1.1 benutzt, manchmal ist der Kommentar tatsächlich 30 Zeichen lang. Der Indikator für v1.1 sind die letzten beiden Byte des Comment-Feldes, ist der vorletzte ein Nullbyte und der letzte ungleich 0, dann ist der letzte die Tracknummer. Ist das vorletzte ungleich 0, ist es v1.0 und die letzten beiden gehören zum Kommentar.

DelphiFreund 12. Dez 2004 19:43

Re: ID3v1 und ID3v2 auslesen
 
Stimmt, darauf sollte man natürlich achten, ich versuche ja auch seit gestern TAGs zu lesen und zu schreiben


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:38 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