Hallo, möchte gerne die id3v2-Informationen aus mp3-Dateien auslesen. Habe dazu folgenden Code gefunden:
Der Code funktioniert zwar super bis auf eine Kleinigkeit. Und zwar ist es ja möglich im id3v2 die Cover bzw Inlets mit anzugeben. Doch beim auslesen mit obigem Code eines solchen id3v2-Tags stehen dann unter den allgemeinen Informationen (album, interpret etc...) nur lauter seltsame Zeichen. Denke das sollen die Bildinformationen sein. Aber damit kann ich nix anfangen.
Lässt sich das irgendwie in brauchbare Informationen wandeln. Welche Informationen werden zu den Bildern überhaupt in dem id3v2 tag gespeichert.
mfg,Olli
PHP:
<?php
/*
//===================================================\\
| |
| ID-Tag Reader by Ansi |
| |
| Reading IDv1.1 and IDv4.0 Tags |
| |
| if you want more frames to be read consult |
| http://www.id3.org/id3v2.3.0.html |
| |
| |
\\===================================================//
*/
function readHeader($mp3){
// -------> Config <-------
$unuebliche_tags = true; //gibt auch Tags aus, die von der üblichen Software *nicht* genutzt werden
// -------> Config <-------
$header = array();
//Liste der genutzen Frames für ID3v2.3 und deren
//Rückgabe im $header[]- Array. Um Übersichtlichkeit
//zu wahren werden alle Frames, die nicht in dieser
//Liste stehen standardmäßig später *nicht* ausgegeben.
$frames = array(
'TPE1' => 'artist',
'TALB' => 'album',
'COMM' => 'comment',
'TBPM' => 'bitrate',
'TCON' => 'genre',
'TCOM' => 'composer',
'TDAT' => 'date',
'TENC' => 'encoder',
'TIT2' => 'title',
'TIT3' => 'subtitle',
'TLAN' => 'languages',
'TLEN' => 'length',
'TYER' => 'year',
'TRCK' => 'track',
'TORY' => 'year',
'TCOP' => 'copyright');
//Liste der Genres und ihrer Entsprechung
$genres = array(
0 => 'Blues',
1 => 'Classic Rock',
2 => 'Country',
3 => 'Dance',
4 => 'Disco',
5 => 'Funk',
6 => 'Grunge',
7 => 'Hip-Hop',
8 => 'Jazz',
9 => 'Metal',
10 => 'New Age',
11 => 'Oldies',
12 => 'Other',
13 => 'Pop',
14 => 'R&B',
15 => 'Rap',
16 => 'Reggae',
17 => 'Rock',
18 => 'Techno',
19 => 'Industrial',
20 => 'Alternative',
21 => 'Ska',
22 => 'Death Metal',
23 => 'Pranks',
24 => 'Soundtrack',
25 => 'Euro-Techno',
26 => 'Ambient',
27 => 'Trip-Hop',
28 => 'Vocal',
29 => 'Jazz+Funk',
30 => 'Fusion',
31 => 'Trance',
32 => 'Classical',
33 => 'Instrumental',
34 => 'Acid',
35 => 'House',
36 => 'Game',
37 => 'Sound Clip',
38 => 'Gospel',
39 => 'Noise',
40 => 'Alternative Rock',
41 => 'Bass',
42 => 'Soul',
43 => 'Punk',
44 => 'Space',
45 => 'Meditative',
46 => 'Instrumental Pop',
47 => 'Instrumental Rock',
48 => 'Ethnic',
49 => 'Gothic',
50 => 'Darkwave',
51 => 'Techno-Industrial',
52 => 'Electronic',
53 => 'Pop-Folk',
54 => 'Eurodance',
55 => 'Dream',
56 => 'Southern Rock',
57 => 'Comedy',
58 => 'Cult',
59 => 'Gangsta',
60 => 'Top 40',
61 => 'Christian Rap',
62 => 'Pop/Funk',
63 => 'Jungle',
64 => 'Native US',
65 => 'Cabaret',
66 => 'New Wave',
67 => 'Psychadelic',
68 => 'Rave',
69 => 'Showtunes',
70 => 'Trailer',
71 => 'Lo-Fi',
72 => 'Tribal',
73 => 'Acid Punk',
74 => 'Acid Jazz',
75 => 'Polka',
76 => 'Retro',
77 => 'Musical',
78 => 'Rock & Roll',
79 => 'Hard Rock',
80 => 'Folk',
81 => 'Folk-Rock',
82 => 'National Folk',
83 => 'Swing',
84 => 'Fast Fusion',
85 => 'Bebob',
86 => 'Latin',
87 => 'Revival',
88 => 'Celtic',
89 => 'Bluegrass',
90 => 'Avantgarde',
91 => 'Gothic Rock',
92 => 'Progressive Rock',
93 => 'Psychedelic Rock',
94 => 'Symphonic Rock',
95 => 'Slow Rock',
96 => 'Big Band',
97 => 'Chorus',
98 => 'Easy Listening',
99 => 'Acoustic',
100 => 'Humour',
101 => 'Speech',
102 => 'Chanson',
103 => 'Opera',
104 => 'Chamber Music',
105 => 'Sonata',
106 => 'Symphony',
107 => 'Booty Bass',
108 => 'Primus',
109 => 'Porn Groove',
110 => 'Satire',
111 => 'Slow Jam',
112 => 'Club',
113 => 'Tango',
114 => 'Samba',
115 => 'Folklore',
116 => 'Ballad',
117 => 'Power Ballad',
118 => 'Rhytmic Soul',
119 => 'Freestyle',
120 => 'Duet',
121 => 'Punk Rock',
122 => 'Drum Solo',
123 => 'Acapella',
124 => 'Euro-House',
125 => 'Dance Hall',
126 => 'Goa',
127 => 'Drum & Bass',
128 => 'Club-House',
129 => 'Hardcore',
130 => 'Terror',
131 => 'Indie',
132 => 'BritPop',
133 => 'Negerpunk',
134 => 'Polsk Punk',
135 => 'Beat',
136 => 'Christian Gangsta Rap',
137 => 'Heavy Metal',
138 => 'Black Metal',
139 => 'Crossover',
140 => 'Contemporary Christian',
141 => 'Christian Rock',
142 => 'Merengue',
143 => 'Salsa',
144 => 'Trash Metal',
145 => 'Anime',
146 => 'Jpop',
147 => 'Synthpop');
//MP3 einlesen
$filelength = filesize($mp3);
$hdl = fopen($mp3, "rb");
if($hdl):
$content .= fread($hdl, $filelength);
fclose($hdl);
endif;
//Versuche ID3v2 Tag zu finden
$IDTag = strpos($content, "ID3");
//Wenn ID3v2 nicht gefunden wird nach ID3v1
//suchen, entspricht TAG
if($IDTag === false):
$IDTag = strpos($content, "TAG");
if($IDTag === false):
$header['type'] = "kein Header gefunden";
return $header;
exit;
else:
$header['type'] = "ID3v1";
//$header['pos'] = $IDTag;
endif;
else:
$header['type'] = "ID3v2";
//$header['pos'] = $IDTag;
endif;
switch ($header['type']):
//ID3v2 Tags auslesen: Flexiblere Felder
case "ID3v2":
//10 Byte des ID3 Headers auslesen
$ID3Header = substr($content, $IDTag, 10);
//Exakte Version der genutzen ID3v2 Version ermitteln
$header['type'] .= ".".ord(substr($ID3Header, 3, 1)).".".ord(substr($ID3Header, 4, 1));
//Gesamte Headerlänge inklusive Frames ermitteln
$HeaderLength = 265 * 8 * 8 * ord(substr($ID3Header, 6, 1)) + 265 * 8 * ord(substr($ID3Header, 7, 1)) + 265 * ord(substr($ID3Header, 8, 1)) + ord(substr($ID3Header, 9, 1));
//ID3 Header in Variabel ablegen, $content leeren
$ID3Header = substr($content, $IDTrag, $HeaderLength + 10);
$content = "";
//Startposition für Frameerkennung ist Byte 10
$CurPos = 10;
//So lange Frames suchen / auslesen, bis eine Frameposition
//leer ist oder der Header durchlaufen wurde
while($CurPos < $HeaderLength + 10):
$FrameName = substr($ID3Header, $CurPos, 4);
if(trim($FrameName) != ""):
$FrameLength = 265 * 8 * 8 * ord(substr($ID3Header, $CurPos + 4, 1)) + 265 * 8 * ord(substr($ID3Header, $CurPos + 5, 1)) + 265 * ord(substr($ID3Header, $CurPos + 6, 1)) + ord(substr($ID3Header, $CurPos + 7, 1));
$FrameContent = substr($ID3Header, $CurPos + 10, $FrameLength);
$CurPos = $CurPos + $FrameLength + 10;
if(array_key_exists($FrameName, $frames) == true):
$header[$frames[$FrameName]] = $FrameContent;
elseif($unuebliche_tags == true):
$counter++;
$header[$FrameName."_".$counter] = $FrameContent;
endif;
else:
break;
endif;
endwhile;
break;
//Hier wird der ID3V1.1 Standard vorausgesetzt,
//der im letzten Byte des Kommentares (127) den Track speichert
case "ID3v1.1":
$header['titel'] = trim(substr($content, $IDTag + 3, 30));
$header['artist'] = trim(substr($content, $IDTag + 33, 30));
$header['album'] = trim(substr($content, $IDTag + 63, 30));
$header['year'] = trim(substr($content, $IDTag + 93, 4));
$header['comment'] = trim(substr($content, $IDTag + 97, 29));
$header['track'] = ord(trim(substr($content, $IDTag + 126, 1)));
$header['genre'] = ord(trim(substr($content, $IDTag + 127, 1)));
if(!$header['genre'] === false):
$header['genre'] = $genres[$header['genre']];
endif;
break;
endswitch;
return $header;
}
// Tabelle für ID- Tags generieren
echo "<table><tr><th align = 'left'>Feld</th><th align = 'left'>Inhalt</th></tr>";
foreach (readHeader('Add N To [X] - 04 - kingdom of shades.mp3') as $key => $value){
echo "<tr><td>$key</td><td>$value</td></tr>";
}
echo "</table>";?>
Der Code funktioniert zwar super bis auf eine Kleinigkeit. Und zwar ist es ja möglich im id3v2 die Cover bzw Inlets mit anzugeben. Doch beim auslesen mit obigem Code eines solchen id3v2-Tags stehen dann unter den allgemeinen Informationen (album, interpret etc...) nur lauter seltsame Zeichen. Denke das sollen die Bildinformationen sein. Aber damit kann ich nix anfangen.
Lässt sich das irgendwie in brauchbare Informationen wandeln. Welche Informationen werden zu den Bildern überhaupt in dem id3v2 tag gespeichert.
mfg,Olli