Strings in Mp3 ID3 V2 TAG auslesen

Housecat

Grünschnabel
Hallo

Ich habe vor einen Mp3 TAG V2 zu schreiben, und zwar auf #C !!. Das Grundgerüst steht. D.h. ich kann die Datei komplett auslesen.. Eine MP3 V2 hat nun folgende Eigenschaften : die Metadaten stehen am Anfang der MP3 und gliedern in verschiedene Bereiche : TIT1 TIT2 etc. wobei jeder Bereich z.B. den Intepret oder den Songtitel beinhaltet...

Frage:
Wie kann ich nun die einzelnen Strings ( Intepret oder Songtitel) auf #C auslesen?

Hier mein vorläufiger Quellcode...
C:
int dateilesen()
{
    FILE *dat_ein;
    char dateiname[50];
    puts("Speicherort und Dateiname eingeben : ");
    scanf("%s",dateiname);
    fflush(stdin);
    puts("\n");

	dat_ein = fopen(dateiname, "r");

    if(dat_ein != NULL)
      
      printf("Open File Sucessfull . . .\n");
      
	  else {
      printf("Failed open File . . .");
      getchar();
	  
	  return EXIT_FAILURE;
                  
                 }
 // fseek(dat_ein,0,SEEK_CUR); 
//

    while (!feof(dat_ein))
   putchar(getc(dat_ein));
	getchar();
   getchar();
   return EXIT_SUCCESS;


   
	putchar (fgetc(dat_ein));
    

	printf("\n\n'Datei fertig gelesen !!\n\n");
	getchar();

    fclose(dat_ein);
    return 0;
 
Willkommen im Forum!
Wie sind denn die Einzelnen Angaben abgegrenzt? Gibts in der Datei Längenangaben, oder dazwischen ein bestimmtes Zeichen etc?

Übrigens ist das nicht #C, auch nicht C#, sondern C (großer Unterschied!)
 
Die Metadaten sind durch Bezeichnungen TIT1 TIT2 TPE etc. getrennt sind aber in der Länge Variabel.

z.B.

Frame ID 4 Byte “TPE1“ (Interpret)
Size 4 Byte 00 00 00 09
Flags 2 Byte 00 00
Data n Byte “Haindling“

usw.

Ne Idee, wie ich die Stings komplett auslesen könnte?
Bin um jede Antwort dankbar...
 
Wenn die ganze Datei so aufgebaut ist, ist das überhaupt kein Problem
Nötige Funktionen:
Mit filelength(fileno(...)) bekommst du die Dateilänge in Bytes, also zB
C++:
#include<io.h>
...
int length;
...
length=filelength(fileno(dat_ein));

Und mit fseek kannst in der Datei herumspringen
Beispiele
fseek(dat_ein,3,SEEK_CUR); springt 3 Zeichen weiter, von da an wird weiter ausgelesen

fseek(dat_ein,-33,SEEK_CUR); springt 33 Zeichen zurück, dh die letzten 33 Zeichen kannst du wieder einlesen

fseek(dat_ein,8,SEEK_SET); springt auf das 8 Byte der Datei (vom Anfang weg), egal wo du gerade bist

fseek(dat_ein,-6,SEEK_END); springt zum 6 Byte vor das Dateiende
 
Danke für Deine schnelle Antwort.

Das ist eine geniale Idee .. Nur das eigentlcihe Problem ist hier:

fseek springen ...wunderbar...Nur der String ab z.B. TIT2 liegt nicht immer auf dem 4.ten Byte.

Das Programm soll zu dem String : "TIT2" springen / oder besser : diesen String suchen. und ab diesem "TIT2" bis zum nächsten "TIT3" alle Zeichen wo dazwischenliegen ausgeben, und zwar NUR diese.

Was erschwerend dazukommt : Ein V2 ID3 Tag ist Variabel von der Zeichenkette her...
D.h. Du kannst (fast) beliebig viele Zeichen für z.B. einen Interpreten vergeben...

Hast noch noch ne Idee, was man da noch machen könnte ?

Danke im Vorraus
 
Geht ja wohl: Du liest die ersten 4 byte und überprüfst, ob das der Teil ist, den du brauchst.
Wenn ja: Liest du einfach weiter die Daten ein und gibst sie aus.
Wenn nein: Liest du noch die Längenbyte ein und springst um soviel Byte weiter, dort wird die ganze Prozedur wiederholt

Was willst du eigentlich am Ende haben?
Ein Programm, dass die einzelnen Teile anzeigen und bearbeiten kann?
 
Das geht ja hier Ruck-Zuck...


Ok, also ich versteh schon was Du meinst....mit der neu ins leben gerufenen Variable: Lenght....habe ich nun auch probiert aber:

wie Du evt. im Quellcode siehst habe ich dort auf Zeile : 26 und 27

den EOF und getc für die komplette Datei angegeben..... mit Deinem Vorschlag was ich sehr gerne realisieren würde, weiss ich dennoch nicht wie ich Deinen Quellcode in meinem Implementieren sollte.

Könntest mein Quellcode mal updaten, und posten wäre tota nettl ?!
 
So, das folgende Programm gibt die Einzelnen Blöcke einmal aus
Ich weis ja nicht, was du dann damit eigentlich machen willst?

Die geänderten Stellen sind mit Kommentaren versehen
C++:
int dateilesen()
{
    FILE *dat_ein;
    char dateiname[50];
    puts("Speicherort und Dateiname eingeben : ");
    gets(dateiname);//Besser, ohne Leerzichenproblem
    fflush(stdin);
    puts("\n");

   dat_ein = fopen(dateiname, "r");
   if(dat_ein != NULL)printf("Open File Sucessfull . . .\n");
   else
    {
      printf("Failed open File . . .");
      getchar();
      return EXIT_FAILURE;
    }

//Ab Hier alles Neu, dafür ein Teil weggelassen
UINT len=filelength(fileno(dat_ein));//Falls UINT Fehler gibt: unsigned long int
UINT pos=0,x,char c;
while(pos<len)
{
   for(c=0;c<4;c++){printf("%c",fgetc(dat_ein));}
   pos+=4;
   printf(": ");
   x=0;
   for(c=0;c<4;c++){x=x*256+fgetc(dat_ein);}
   fseek(dat_ein,2,SEEK_CUR);
   pos=pos+6+x;
   while(x)
   {
      c=fgetc(dat_ein);
      printf("%c",(c>=0&&c<32)?32:c);
      x--;
   }
}
//Neu-Ende

   printf("\n\n'Datei fertig gelesen !!\n\n");
   fclose(dat_ein);//Sollte vllt. vorm getchar sein, was ist wenn der
                 //Benutzer das Programm beim getchar zumacht?
   getchar();
   return 0;
}
 
Zurück