Problem eim Auslesen von Id3V1 Tags

Vlt

Grünschnabel
Hallo,
ich versuche nun schon seit Tagen den Id3V1 Tag von Mp3s auszulesen.
Dazu hab ich fogenden code geschrieben:
Code:
struct id3 {
               char  tag[3];
               char  title[31];
               char  artist[31];
               char  album[31];
               char  year[5];
               char  comment[31];
               int 	   genre;
               int	   track;
	}  play1;

/* szPath enthält den PAfd zu der .mp3-Datei */
id3 readid3(char *szPath) {
	
		FILE	*datei_ptr;
		char 	ver[2];
		
		datei_ptr = fopen(szPath, "r+b");
		
		if ( datei_ptr != 0) {
			
			if (fseek(datei_ptr,-128,SEEK_END) == 0) {

                                                                                     fgets(play1.tag,4,datei_ptr);	
				fgets(play1.title,31,datei_ptr);
				fgets(play1.artist,31,datei_ptr);
				fgets(play1.album,31,datei_ptr);
				fgets(play1.year,5,datei_ptr);
				fgets(play1.comment,31,datei_ptr);
				fgets(ver,2,datei_ptr);
				play1.genre = atoi(ver);
}
			else 
				printf("Zeiger konnte nicht gesetzt werden!");
			
			fclose(datei_ptr);
	 	}
	 	
		else
			printf("Fehler beim öffnen der Datei!");
				
		return play1;
			
	}
Wenn ich mir die Struktur play1 mit printf anzeigen lasse werden Titel, Artist, Album, Jahr und Kommentar richtig angezeigt, aber für Genre wird 0 ausgegeben. Ich bin aber sicher, dass für Genre ein Wert gesetzt ist, da bei WinAmp das Genre richtig angezeigt wird.
Ich hoffe, dass Ihr mir sagen könnt wo mein Fehler liegt.

MFG, VLT
 
Hi,

benutz bitte nicht
Code:
fgets(play1.album,31,datei_ptr);
sondern
Code:
fread(play1.album, 30, 1, datei_ptr);

Sprich: 30 Bytes auslesen, und nicht 31 und diese auch binär.
Geht in dem Fall zwar auch mit Text, aber schönder ist es binär :)

Dann: Nachdem du deine 125 Bytes ausgelesen hast, bleibt noch genau eines Übrig,
nicht zwei.
Und diesen dann auch im binär-Modus:
Code:
char ver[1];
fread(ver, 1, 1, datei_ptr);
Jetzt hast du in ver[0] die ID des Genres.

Ps: WinAmp benutzt einige zusätzliche Genres, die nicht in den 80 "Standard" Genres
drin sind!

Pps: Wenn du die Zeichenketten initialiserst, setzte auf Position 30 die binäre null:
Code:
char sArtist[31];
sArtist[30] = '\0';
Grunde: Manche Leute halten sich wohl für etwas besseres und benutzen zum auffüllen
der 30 Bytes keine Binär-Nullen sondern Leerzeichen (ASCII 32).

Hier steht übrigens alles über den ID3v1 Tag:
http://www.id3.org/easy.html
 
Zuletzt bearbeitet von einem Moderator:
Danke für deine HIlfe!
Jetzt klappt es so, wie ich es mir vorgestellt habe.

Dan mach ich mich mal an die zweite Version der ID3 Tags :-)

MFG, Vlt
 
Zurück