php MP3 tag/header shit

Pagina: 1
Acties:
  • 222 views sinds 30-01-2008

  • franklin
  • Registratie: Februari 2000
  • Laatst online: 06-08 16:28

franklin

denkt teveel...

Topicstarter
Hoi,

ik ben bezig met wat shit in php om van mp3 files de tag en de header te kunnen lezen...
Iemand nog goede ideeen, aanmerkingen, opmerkingen???

Oh ja, ik roep m als volgt aan: [url="http://localhost/tag.php?mp3file=york.mp3"]http://localhost/tag.php?mp3file=york.mp3[/url]
(york.mp3 staat dus in dezelfde dir.)

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
<?
    // Constanten; NIET COMPLEET! Slechts wat we nodig hebben!

    $version[0] = "Mpeg v2.5";
    $version[1] = "Reserved";
    $version[2] = "Mpeg v2.0";
    $version[3] = "Mpeg v1.0";
    
    $layer[0] = "Reserved";
    $layer[1] = "Layer III";
    $layer[2] = "Layer II";
    $layer[3] = "Layer I";

    $protection[0] = "Protected";
    $protection[1] = "Not Protected";

    $bitrate[1][1] = "32";
    $bitrate[1][2] = "40";
    $bitrate[1][3] = "48";
    $bitrate[1][4] = "56";
    $bitrate[1][5] = "64";
    $bitrate[1][6] = "80";
    $bitrate[1][7] = "96";
    $bitrate[1][8] = "112";
    $bitrate[1][9] = "128";
    $bitrate[1][10] = "160";
    $bitrate[1][11] = "192";
    $bitrate[1][12] = "224";
    $bitrate[1][13] = "256";
    
    $frequency[3][0] = "44100";
    $frequency[3][1] = "48000";
    $frequency[3][2] = "32000";
    
    $mp3header_bin = "";
    $mp3header = "";
    
    /* Diverse functies */
    
    function MP3_CalcLength ($MP3_FileSize, $MP3_Bitrate) {
    
        return (($MP3_FileSize-132)/(($MP3_Bitrate*1000)/8))." sec.";
        
        }
    
    function MP3_ReadID3Tag ($MP3_FileName) {
        
    /*  $id3tag [0] -   Song Title
                [1] -   Artist
                [2] -   Album Title
                [3] -   Year
                [4] -   Comments
                [5] -   Genre
    */
    
        if (file_exists($MP3_FileName)) {
            
            // Moet nog checken of eerste 3 letters 'TAG' vormen!!!
                
            $fp = fopen( "$MP3_FileName", "r");

            fseek ($fp, (filesize("$MP3_FileName") - 125) );
                    
            $id3tag [0] = fread ($fp, 30);
            $id3tag [1] = fread ($fp, 30);
            $id3tag [2] = fread ($fp, 30);
            $id3tag [3] = fread ($fp, 4);
            $id3tag [4] = fread ($fp, 30);
            $id3tag [5] = ord(fread ($fp, 1));
            
            fclose ($fp);   
            
            return $id3tag;
            }    
        else {
            
            }
        
        }
    
    function MP3_ReadHeader ($MP3_FileName) {
    
    /*  $mp3header  [0] -   Filesize
                    [1] -   MPEG Version
                    [2] -   Layer
                    [3] -   Protection
                    [4] -   Bitrate 
                    [5] -   Frequency
                    [6] -   Padding
                    [7] -   Extension
                    [8] -   Mode
                    [9] -   Mode Extension
                    [10]-   Copyright
                    [11]-   Original
                    [12]-   Emphasis            
    */


        $mp3header = "";
        $mp3header_bin = "";
    
        if (file_exists($MP3_FileName)) {
        
            $mp3header[0] = filesize( "$MP3_FileName");
            
            $fp = fopen( "$MP3_FileName", "r");
             
            for ( $i = 1; $i <= 3; $i++) {
                fseek ( $fp, $i);
                $mp3header_bin.= decbin( ord( fread( $fp, 1)));
                }
                                
            $mp3header [1] = bindec ( substr ( $mp3header_bin, 3, 2));
            $mp3header [2] = bindec ( substr ( $mp3header_bin, 5, 2));      
            $mp3header [3] = bindec ( substr ( $mp3header_bin, 7, 1));      
            $mp3header [4] = bindec ( substr ( $mp3header_bin, 8, 4));              
            $mp3header [5] = bindec ( substr ( $mp3header_bin, 12, 2));
            $mp3header [6] = bindec ( substr ( $mp3header_bin, 14, 1));
            $mp3header [7] = bindec ( substr ( $mp3header_bin, 15, 1));
            $mp3header [8] = bindec ( substr ( $mp3header_bin, 16, 2));
            $mp3header [9] = bindec ( substr ( $mp3header_bin, 18, 2)); 
            $mp3header [10]= bindec ( substr ( $mp3header_bin, 20, 1)); 
            $mp3header [11]= bindec ( substr ( $mp3header_bin, 21, 1)); 
            $mp3header [12]= bindec ( substr ( $mp3header_bin, 22, 2)); 
         
            fclose ($fp);
               
            return $mp3header;
            }
        else {
            
            }
        }
        
        
    /* MAIN */
    
    $mp3header = MP3_ReadHeader ("$mp3file");
    $id3tag = MP3_ReadID3Tag ("$mp3file");
                
        echo $version[$mp3header[1]]."
";
        echo $layer[$mp3header[2]]."
";
        echo $protection[$mp3header[3]]."
";
        echo $bitrate[$mp3header[2]][$mp3header[4]]."
";
        echo $frequency[$mp3header[1]][$mp3header[5]]."
";
        echo "Length: ".MP3_CalcLength ($mp3header[0], $bitrate[$mp3header[2]][$mp3header[4]])."
"; 
        echo $id3tag [1]."
";
        echo $id3tag [2]."
";
        echo $id3tag [3]."
";
        echo $id3tag [4]."
";      
        echo ord($id3tag [5]);
    
?>

Verwijderd

Heej.. da's wel cool! ik heb net zowiets, maar dan in pascal/delphi... hebbuh? misschien handig voor conversion?

  • franklin
  • Registratie: Februari 2000
  • Laatst online: 06-08 16:28

franklin

denkt teveel...

Topicstarter
sure,.. ben wel benieuwd hoe anderen dat doen, ik kon hier bar weinig info over vinden nl.

  • Bikkeltje
  • Registratie: Februari 2000
  • Laatst online: 16:00
Dit is wat ik heb.
Ik haal de headers uit de mp3 en stop die vervolgens in een mySQL databeest.
function get_id3($filename) {

$id3_genres_array = array('Blues','Classic Rock','Country','Dance', 'Disco', 'Funk','Grunge', 'Hip-Hop', 'Jazz', 'Metal', 'New Age', 'Oldies', 'Other', 'Pop','R&B', 'Rap', 'Reggae', 'Rock', 'Techno', 'Industrial','Alternative', 'Ska', 'Death Metal', 'Pranks', 'Soundtrack','Euro-Techno', 'Ambient', 'Trip-Hop', 'Vocal', 'Jazz+Funk', 'Fusion', 'Trance','Classical', 'Instrumental', 'Acid', 'House','Game', 'Sound Clip', 'Gospel', 'Noise', 'AlternRock', 'Bass','Soul', 'Punk', 'Space', 'Meditative', 'Instrumental Pop', 'Instrumental Rock','Ethnic', 'Gothic', 'Darkwave','Techno-Industrial', 'Electronic', 'Pop-Folk', 'Eurodance', 'Dream','Southern Rock', 'Comedy', 'Cult', 'Gangsta', 'Top 40', 'Christian Rap','Pop/Funk', 'Jungle', 'Native American', 'Cabaret','New Wave', 'Psychadelic', 'Rave', 'Showtunes', 'Trailer', 'Lo-Fi','Tribal', 'Acid Punk', 'Acid Jazz', 'Polka', 'Retro', 'Musical', 'Rock & Roll','Hard Rock', 'Folk', 'Folk/Rock', 'National Folk','Swing', 'Fast Fusion', 'Bebob', 'Latin', 'Revival', 'Celtic','Bluegrass', 'Avantgarde', 'Gothic Rock', 'Progressive Rock', 'Psychedelic','Rock', 'Symphonic Rock', 'Slow Rock', 'Big Band','Chorus', 'Easy Listening', 'Acoustic', 'Humour', 'Speech','Chanson', 'Opera', 'Chamber Music', 'Sonata', 'Symphony', 'Booty Bass','Primus', 'Porn Groove', 'Satire', 'Slow Jam', 'Club', 'Tango', 'Samba','Folklore', 'Ballad', 'Power Ballad', 'Rhythmic Soul', 'Freestyle','Duet', 'Punk Rock', 'Drum Solo', 'Acapella', 'Euro-house', 'Dance Hall');

$fp = fopen($filename,"r");
fseek($fp, -128, SEEK_END);
$line = fread($fp, 10000);
if(preg_match("/^TAG/", $line)) {
$id3 = unpack("a3tag/a30title/a30author/a30album/a4year/a30comment/C1genre_id", $line);
$id3["genre"] = $id3_genres_array[$id3["genre_id"]];
return array($id3['author'],$id3['title'],$id3['album'],$id3['year'],$id3['comment'],$id3['genre']);
//echo "\n$id3[author] - $id3[title] - $id3[album] - $id3[year] - $id3[genre]\n";

} else {
echo "no id3 tag found";
}
}

function UpdateDb() {

connect();

// first see what's allready in the database
$result = mysql_query("SELECT filename FROM songs");
$fp = fopen("filelistFromDb.txt","w");
while($row=mysql_fetch_array($result))
{
$filename = $row['filename'];
fwrite($fp, $filename. "\n");
}
fclose($fp);

// then find out what's on disk
system("find /mp3/ | grep mp3 >filelistFromFs.txt");

// now let's see the differences

// first sorting the files
system("sort filelistFromDb.txt >sortedFromDb.txt");
system("sort filelistFromFs.txt >sortedFromFs.txt");

// then compare
system("diff sortedFromDb.txt sortedFromFs.txt | grep mp3 >differences.txt");

// let's see the result:


// now let's put the new file in the database

$fp = fopen("differences.txt","r");
while ($line = fgets($fp, 1024))
{
if(substr($line,-5, 4) == '.mp3')
{
if(substr($line, 0, 1) == '>')
{
$filename = addslashes(substr($line,2,-1));
$filenameSplitted = split("/", $filename);
$filenameWithoutPath = $filenameSplitted[ sizeOf($filenameSplitted)-1];
//echo "\n<b>$filenameWithoutPath</b>\n";

list($artist,$songtitle,$album,$year,$comment,$genre) = get_id3("/mp3/" .$filenameWithoutPath);
//echo "\n$artist,$songtitle,$album,$year,$comment,$genre,$filename\n";
$time = time();
$result = mysql_query("INSERT INTO songs VALUES ('','$artist','$songtitle','$album','$year','$comment','$genre','$filename','$time')");
if (mysql_error()) { echo mysql_error();}
}
else
{
$filename = addslashes(substr($line, 2, -1));
$result = mysql_query("DELETE FROM songs WHERE filename='$filename'");
if (mysql_error()) { echo mysql_error();}
}
}
}
system("rm sortedFromDb.txt sortedFromFs.txt filelistFromDb.txt filelistFromFs.txt differences.txt");
}

  • franklin
  • Registratie: Februari 2000
  • Laatst online: 06-08 16:28

franklin

denkt teveel...

Topicstarter
cool! die 'pack' functie kende ik nog niet!! Dus direkt mijn scriptje ff hier en daar aangepast :)

Waar gebruik jij het precies voor?

  • Tim Schuhmacher
  • Registratie: Januari 2000
  • Laatst online: 22-08 17:19

Tim Schuhmacher

abasios

Euh heb ik een klein vraagje voor Razor-blade

Jij heb dat mp3-header etc lezen voor Delphi. Zou je dat kunnen emailen naar mij?
Bvd

Verwijderd

Grmbl... ik wou eigenlijk de complete 127 kb aan code hiero pasten, maar dat mag niet :( (postings.cgi loopt vast :D )

is dit genoeg???

MPEG AUDIO TOOLS DELPHI UNIT (D1, D2, D3)
Version 1.7. Freeware.
This library gives you tools for manipulating
MPEG AUDIO files (*.mp?) and list o files,
including importing from known playlist file
formats. It allows very easy reading and
writing of MPEG data (TAG and HEADER).
Supported formats are MPEG Versions 1, and 2,
Layer I, II and III.


<A HREF="ftp://ftp.lipetsk.ru/incoming/mpgtools.pas" TARGET=_blank>mpgtools.pas</A>

Verwijderd

Franklin, hoe heb jij die kewle code quote gemaakt (en dan bedoel ik dus dat code ipc quote daar neer gezet... ?

  • franklin
  • Registratie: Februari 2000
  • Laatst online: 06-08 16:28

franklin

denkt teveel...

Topicstarter
de code tussen [ code] <? phpmeuk ?> [ /code] zetten... ik weet niet eens hoe ik daar bij komt maar het werkte wel :)

(en dan zonder die spaties ;) )

  • Rickbv
  • Registratie: September 2000
  • Laatst online: 17:43
...en bijna 2 jaar later komt er een gek langs die het scriptje gaat proberen en een probleem tegenkomt :D

ik gebruik nu dit script, dat van Bikkeltje komt:
PHP:
1
<?function get_id3($filename) {$id3_genres_array = array('Blues','Classic Rock','Country',enz.....);$fp = @fopen($filename,"r");@fseek($fp, -128, SEEK_END);$line = @fread($fp, 10000);if(preg_match("/^TAG/", $line)) {$id3 = unpack("a3tag/a30title/a30author/a30album/a4year/a30comment/C1genre_id", $line);$id3["genre"] = $id3_genres_array[$id3["genre_id"]];//return array($id3['author'],$id3['title'],$id3['album'],$id3['year'],$id3['comment'],$id3['genre']);echo "\n$id3[author] - $id3[title] - $id3[album] - $id3[year] - $id3[comment] - $id3[genre]\n<br>";}?>

dit krijg ik als output uit een bepaalde dir:
code:
1
2
3
4
5
6
7
8
9
10
Brainpower - Dansplaat - Verschil Moet Er ZIjn - 2002 -  - Hip-Hop 
DJ Tiesto - Battleship Grey - In My Memory - 2001 -  - Trance 
DJ Tiesto - Close To You - In My Memory - 2001 - Blaaaaaaaaat - Trance 
DJ Tiesto - Dallas 4pm - In My Memory - 2001 -  - Trance 
DJ Tiesto - Flight 643 - In my memory - 2001 -  - Trance 
DJ Tiesto - In My Memory - In My Memory - 2001 -  - Trance 
DJ Tiesto - Lethal Industry - In My Memory - 2001 -  - Trance 
DJ Tiesto - Magik Journey - In My Memory - 2001 -  - Trance 
DJ Tiesto - Obsession - In My Memory - 2001 -  - Trance 
DJ Tiesto - Suburban Train - In My Memory - 2001 - - Trance

Maar wat moet ik nou met die dingen doen? Ik vind het er maar irritant tussen staan. Het komt voor als er geen comment is ingevuld, maar ook als deze wel ingevuld is...

Wat is het probleem?

edit:

ff geduld hoor, hier staan weer niet van die irritante vierkantjes :?
deze bedoel ik dus:
Afbeeldingslocatie: http://home.wanadoo.nl/rick.kessel/scherm.gif
Dit staat in de bron, hierbij zijn wel 30 tekens oningevuld, maar bij artist enzo niet?
Afbeeldingslocatie: http://home.wanadoo.nl/rick.kessel/scherm2.gif

  • Crazy D
  • Registratie: Augustus 2000
  • Laatst online: 14-08 12:38

Crazy D

I think we should take a look.

Op vrijdag 17 mei 2002 19:36 schreef Rickbv het volgende:
...en bijna 2 jaar later komt er een gek langs die het scriptje gaat proberen en een probleem tegenkomt :D
:D
Maar wat moet ik nou met die dingen doen? Ik vind het er maar irritant tussen staan. Het komt voor als er geen comment is ingevuld, maar ook als deze wel ingevuld is...

Wat is het probleem?
Inderdaad, wat is het probleem?
Wat _wil_ je met diew mp3-tag info doen?
Als je de code bekijkt zie je dat al die taginfo gewoon ge-echo't wordt. Dus i.p.v. te echo'en doe je daar gewoon wat je met die info wilt doen... en tjah als er een tag-veld niet gevuld is, check je eerst of er een waarde in zit en zo nee dan doe je er niks mee... :)

Probeer je vraag anders nog even in begrijpelijke taal te stellen ;)

Exact expert nodig?


Verwijderd

Even zoeken op SourceForge er bestaat namelijk al een class waarmee je dus echt goed je mp3 kunt inlezen.

  • Rickbv
  • Registratie: September 2000
  • Laatst online: 17:43
Op zaterdag 18 mei 2002 13:26 schreef Crazy_D het volgende:
Inderdaad, wat is het probleem?
Wat _wil_ je met diew mp3-tag info doen?
Als je de code bekijkt zie je dat al die taginfo gewoon ge-echo't wordt. Dus i.p.v. te echo'en doe je daar gewoon wat je met die info wilt doen... en tjah als er een tag-veld niet gevuld is, check je eerst of er een waarde in zit en zo nee dan doe je er niks mee... :)

Probeer je vraag anders nog even in begrijpelijke taal te stellen ;)
Ja, de afbeeldingen zijn ff weggevallen door de server, dan lijkt de vraag idd heeeel vaag omdat het probleem niet te zien is :P

TimD: ik ga ff kijken, alvast bedankt voor je tip. Al moet ik zeggen dat ik dit script opzich ook nog nieteens zo fout vond.

  • Rickbv
  • Registratie: September 2000
  • Laatst online: 17:43
Heb inmiddels wel wat scripts van SourceForge gedownload, maar die pakketten deden het niet bij mij. Daarnaast is het denk wel veel werk om zo'n script er dan weer uit te slopen. Ik vind daarom dit script eigenlijk wel best, maar ik vind alleen die comment output zo raar...

  • Rense Klinkenberg
  • Registratie: November 2000
  • Laatst online: 09-08 19:19
In het PEAR package van php zit ook ergens een ID3 classe verwerkt, misschien dat die het wel beter doet.

  • Rickbv
  • Registratie: September 2000
  • Laatst online: 17:43
het zal wel aan mij liggen hoor, maar na 2uur die site van pear en php doorgezocht te hebben kan ik nog steeds dat package geval niet vinden. Ik moet toch kijken bij pear.php.net?

Verwijderd

Code ziet er nice uit. Alleen volgens mij zit er in de lengte berekening van het bestand een foutje :)
Je gebruikt namelijk de file-size waar je 132 vanaf trekt. Dit werkt ALLEEN maar als je alleen een ID3v1 tag hebt. Een ID3v2 tag wordt aan het einde van het bestand geplakt, en heeft een variabele lengte, voor zover als ik het mij herinner :)

  • Bergen
  • Registratie: Maart 2001
  • Laatst online: 18-08 10:58

Bergen

Spellingscontroleur

Op dinsdag 04 juli 2000 14:55 schreef DOS het volgende:
Franklin, hoe heb jij die kewle code quote gemaakt (en dan bedoel ik dus dat code ipc quote daar neer gezet... ?
Hmm jij hebt de FAQ niet gelezen :) Daar staat dat namelijk allemaal in! Heheheh je hebt jezelf verraden :o

  • Rickbv
  • Registratie: September 2000
  • Laatst online: 17:43
Hieronymus: met zowel ID3 v1 _en_ ID3 v2 doet hij het hier ook nog gewoon volgens mij, dat is dan ook nog het rare. Maar als ik bijvoorbeeld comment 29char maak, dan geeft hij niet zo'n vierkantje. (al klopt het genre dan uiteraard niet meer, omdat hij dan een char verder pakt als genre veld).

GerbenW: topic is bijna 2 oud, volgens mij kon dit toen nog maar net, en daarom vroeg hij dat denk ik :Y)

Verwijderd

Op zondag 19 mei 2002 22:12 schreef Rickbv het volgende:
Hieronymus: bij ID3 v2 doet hij het hier ook gewoon volgens mij, dat is dan ook nog het rare. Maar als ik bijvoorbeeld comment 29char maak, dan geeft hij niet zo'n vierkantje. (al klopt het genre dan uiteraard niet meer, omdat hij dan een char verder pakt als genre veld).
Ik zeg ook niet dat hij het niet zou doen, geenszins. Echter hij zal het liedje langer vinden dan dat winamp hem vindt.
Hij deelt de extra data aan het eind ook nog door de bitrate om het aantal seconden te bepalen.

Alleen zal het aan de andere kant wel meevallen. Een gemiddeld tag bestaat misschien uit 250 bytes als je een klein beetje hebt ingevuld. dat valt natuurlijk in het niet bij een bitrate van 192k >:) Dus de afwijking zal in het algemeen te verwaarlozen zijn, het is gewoon niet netjes, zullen we het daarop houden ;)

  • Rickbv
  • Registratie: September 2000
  • Laatst online: 17:43
Ow, je bedoelde de afspeeltijd oid? Nou gebruik ik die toch niet, dus dat zal wel meevallen.

Ben nog een php newbie, maar als ik het goed begrijp dat het script hetvolgende nu:

lees bestand in, zoek eindpunt op, ga daar 128 characters hoger staan, lees stuk voor stuk de verschillende inputs uit. Maar als er nou een ID3 v2 code nog achteraan komt, hoe weet dat ding dan waar 'ie moet zijn? Of is dat een hele domme vraag :?

Verwijderd

Op zondag 19 mei 2002 22:25 schreef Rickbv het volgende:
Ow, je bedoelde de afspeeltijd oid? Nou gebruik ik die toch niet, dus dat zal wel meevallen.

Ben nog een php newbie, maar als ik het goed begrijp dat het script hetvolgende nu:

lees bestand in, zoek eindpunt op, ga daar 128 characters hoger staan, lees stuk voor stuk de verschillende inputs uit. Maar als er nou een ID3 v2 code nog achteraan komt, hoe weet dat ding dan waar 'ie moet zijn? Of is dat een hele domme vraag :?
Je hebt het bijna goed.
MP3 opbouw (versimpeld): ID3v1 + liedje + ID3v2

Je code gebruikt voor het berekenen van de afspeeltijd de filesize, en trekt daar een bepaald aantal bytes af voor de ID3v1 tag die vooraan staat. Maar het script "vergeet" er een bepaald aantal bytes vanaf te trekken voor dat ID3v2 tag achteraan. Je kan de lokatie hiervan natuurlijk wel detecteren en het verbeteren, maar dat laat ik aan jou over. ;)

  • Rickbv
  • Registratie: September 2000
  • Laatst online: 17:43
aha, bedankt voor je info :)

Maar ik ben weer verder gegaan, en heb nu dit:
PHP:
1
<?$id3 = unpack("a3tag/a30title/a30author/a30album/a4year/a29comment/a1blaat/C1genre_id", $line);?>

Nu zie je bij comment dus geen [] vierkantje meer, al is je veld nog maar 29chars. Wat dan wel weer vaag is; als ik $id[blaat] echo, dan komt er _geen_ vierkantje. Dat is toch vaag? Want dat []'tje komt telkens aan het einde van het comment veld lijkt het. Nu haal ik die er dus uit met een extra veld "blaat", dus zou je zeggen dat die dan dat rare ding moet bevatten? Ik vind het maar vaag :D

edit:

Problem solved :'(

Als ik geen tracknummer invul, gaat alles goed eigenlijk :? Dus mijn vraag is dan, waar zit dat *#&*#$ tracknummer? En zou dit betekenen dat het echt niet kan met tracknummer, of is er nog een andere mogelijkheid. Zou het erg jammer vinden als ik al die nummers weg moet halen om het zooitje in de database te laden...

Verwijderd

Volgens mij was er in de originele spec van ID3v1 geen ruimte voor het tracknummer opgenomen. ZOu je es een oude versie van WinAmp moeten bekijken :)

  • Rickbv
  • Registratie: September 2000
  • Laatst online: 17:43
Hmmm, misschien dan een foute vraag van mij: waar slaat hij het dan op? En hoe kan het dat het tracknummer dan nog invloed uitoefent op de andere velden (comments)?

Verwijderd

Zoals ik zei er WAS geen plek voor. Ze hebben het er volgens mij tussengepropt ergens. Ik raad je aan om even de specificatie op te zoeken. Die staat vast wel ergens beschreven. Anders met een hexeditor even een mp3 bestand bekijken kan ook licht op de zaak werpen.

  • Rense Klinkenberg
  • Registratie: November 2000
  • Laatst online: 09-08 19:19
Op zondag 19 mei 2002 20:10 schreef Rickbv het volgende:
het zal wel aan mij liggen hoor, maar na 2uur die site van pear en php doorgezocht te hebben kan ik nog steeds dat package geval niet vinden. Ik moet toch kijken bij pear.php.net?
Die site is nog lang niet up-to-date. Je moet nu alles nog van de cvs server halen.

http://cvs.php.net/co.php/pear/MP3_Id/MP3_Id.php?r=1.5 is het scriptje dat ik bedoelde. Downloaden kan hier. Het bestand moet je in je eigen pear directory zetten in de directory MP3_Id.

Andere manier is natuurlijk even met de installer te spelen ;)

  • Rickbv
  • Registratie: September 2000
  • Laatst online: 17:43
Heb de Hex editor er maar es bijgepakt, maar klopt het wel wat je zegt over "ID3v1 + liedje + ID3v2"? Want volgens mij zie ik bovenaan de ID3v2 staan en juist onderaan de ID3v1 tag... (of moet je chinees zijn en van beneden naar boven lezen? :D )

Dit staat achteraan het bestandje. Tracknummer heb ik 121 ingevuld.
code:
1
TAGClose To You..................DJ Tiesto.....................In My Memory..................2001Dit is ID3v1.................yÿ

Hier is dezelfde, maar dan zonder tracknummer ingevuld.
code:
1
TAGClose To You..................DJ Tiesto.....................In My Memory..................2001Dit is ID3v1..................ÿ

Dus is het dan dat y ding? En daarmee is het ook gelijk opgelost waarom hij zo'n [] weergeeft, want dat y'tje is de 30'e char van comment...

edit:

Ben er nu achter gekomen dat tracknummer de laatste characters van comment inbeslag nemen. Want als ik 121 als tracknummer in vul passen er nog maar 28chars in het comment veld. Maar hoe een ID3v1 tag met tracknummer dan wordt uitgelezen met een programma als winamp moet ik nog ff uitzoeken...

Verwijderd

Je hebt gelijk, ik heb het omgedraaid :) tis ID3v2 + Song + ID3v1. Lees ook maar es na op: http://www.mp3-converter.com/mp3codec/id3.htm

  • CyeZ
  • Registratie: September 2001
  • Laatst online: 22:06

CyeZ

Vroem vroem!!!

Ik zou eens hier een kijkje nemen:
http://www.id3.org/id3v1.html

Bij de eerste link staan 2 versies van ID3v1 beschreven, namelijk v1 en v1.1

Bij versie 1.1 is het commentaar veld iets ingekort (met 2 characters) en is er een tracklength veldje tussen gepropt. Dit tracklength veldje wordt altijd vooraf gegaan door een ascii 0 karakter zodat de meeste oude programma's die hier nog geen rekening mee hielden er ook geen problemen mee krijgen bij het tonen van de comment, omdat normaliter dat ascii 0 karakter het einde van een string aangeeft.

Hier is eventueel nog wat verdere informatie over id3v2 te vinden, ook hier zijn verschillende versies van:
http://www.id3.org/develop.html

Ik heb zelf een webserver met ingebouwde mp3-player gemaakt, daarbij kwam ik ditzelfde probleem ook tegen.

[18:54] <Prammenhanger> |HunterPro|eet
[18:55] <Prammenhanger> lijkt best op
[18:55] <Prammenhanger> |HunterProFeet


  • Rickbv
  • Registratie: September 2000
  • Laatst online: 17:43
Bedankt! Aan die link heb ik veel gehad! :)

Maar ik ben nu alweer een paar uur bezig maar kom er nog niet uit...

Je moet dus controleren of de 29e char van comment 0bytes is en de 30e NIET 0bytes. Maar nu heb ik al verschillende dingen gedaan (oa. met hexdec, dechex etc) maar het wil maar niet. Het gaat al fout met het checken of de 29e char 0bytes is. Want "if (substr($blaat, 126, 1)=="")" werkt niet.

Dus zou je dus misschien een voorzetje willen geven hoe jij het hebt gedaan in je webserver-met-ingebouwde-mp3-player-script? En wat niet lukte / ik niet snapte: in m'n HEXeditor zie ik al die hexadecimale getallen staan, maar als PHP er een lijn uit leest is alles al naar "ABCabc" etc geconventeerd. Dus zou ik straks zo'n track-byte uit willen lezen, dan moet ik van "ABCabc" naar decimaal gaan, maar hoe? Ik snap er effe helemaal nix meer van |:(

  • CyeZ
  • Registratie: September 2001
  • Laatst online: 22:06

CyeZ

Vroem vroem!!!

"if ($blaat[126]=='\0')" zal wel werken denk ik.
Ik heb mijn servertje overigens niet in php geschreven, maar in Delphi.

[18:54] <Prammenhanger> |HunterPro|eet
[18:55] <Prammenhanger> lijkt best op
[18:55] <Prammenhanger> |HunterProFeet


  • mr.inno
  • Registratie: April 2003
  • Laatst online: 09-06 21:24
hey mensen ik heb de oplossing al voor id3v1.
ben nu verder bezig met id3v2.3.0
das wat ingewikkelder. :S

dit is de functie die ik er voor gebruik..
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
function ArrayOfGenres() {
    static $GenreLookup = array();
    if (empty($GenreLookup)) {
        $GenreLookup[0]    = 'Blues';
        $GenreLookup[1]    = 'Classic Rock';
        $GenreLookup[2]    = 'Country';
        $GenreLookup[3]    = 'Dance';
        $GenreLookup[4]    = 'Disco';
        $GenreLookup[5]    = 'Funk';
        $GenreLookup[6]    = 'Grunge';
        $GenreLookup[7]    = 'Hip-Hop';
        $GenreLookup[8]    = 'Jazz';
        $GenreLookup[9]    = 'Metal';
        $GenreLookup[10]   = 'New Age';
        $GenreLookup[11]   = 'Oldies';
        $GenreLookup[12]   = 'Other';
        $GenreLookup[13]   = 'Pop';
        $GenreLookup[14]   = 'R&B';
        $GenreLookup[15]   = 'Rap';
        $GenreLookup[16]   = 'Reggae';
        $GenreLookup[17]   = 'Rock';
        $GenreLookup[18]   = 'Techno';
        $GenreLookup[19]   = 'Industrial';
        $GenreLookup[20]   = 'Alternative';
        $GenreLookup[21]   = 'Ska';
        $GenreLookup[22]   = 'Death Metal';
        $GenreLookup[23]   = 'Pranks';
        $GenreLookup[24]   = 'Soundtrack';
        $GenreLookup[25]   = 'Euro-Techno';
        $GenreLookup[26]   = 'Ambient';
        $GenreLookup[27]   = 'Trip-Hop';
        $GenreLookup[28]   = 'Vocal';
        $GenreLookup[29]   = 'Jazz+Funk';
        $GenreLookup[30]   = 'Fusion';
        $GenreLookup[31]   = 'Trance';
        $GenreLookup[32]   = 'Classical';
        $GenreLookup[33]   = 'Instrumental';
        $GenreLookup[34]   = 'Acid';
        $GenreLookup[35]   = 'House';
        $GenreLookup[36]   = 'Game';
        $GenreLookup[37]   = 'Sound Clip';
        $GenreLookup[38]   = 'Gospel';
        $GenreLookup[39]   = 'Noise';
        $GenreLookup[40]   = 'Alt. Rock';
        $GenreLookup[41]   = 'Bass';
        $GenreLookup[42]   = 'Soul';
        $GenreLookup[43]   = 'Punk';
        $GenreLookup[44]   = 'Space';
        $GenreLookup[45]   = 'Meditative';
        $GenreLookup[46]   = 'Instrumental Pop';
        $GenreLookup[47]   = 'Instrumental Rock';
        $GenreLookup[48]   = 'Ethnic';
        $GenreLookup[49]   = 'Gothic';
        $GenreLookup[50]   = 'Darkwave';
        $GenreLookup[51]   = 'Techno-Industrial';
        $GenreLookup[52]   = 'Electronic';
        $GenreLookup[53]   = 'Folk/Pop';
        $GenreLookup[54]   = 'Eurodance';
        $GenreLookup[55]   = 'Dream';
        $GenreLookup[56]   = 'Southern Rock';
        $GenreLookup[57]   = 'Comedy';
        $GenreLookup[58]   = 'Cult';
        $GenreLookup[59]   = 'Gangsta';
        $GenreLookup[60]   = 'Top 40';
        $GenreLookup[61]   = 'Christian Rap';
        $GenreLookup[62]   = 'Pop/Funk';
        $GenreLookup[63]   = 'Jungle';
        $GenreLookup[64]   = 'Native American';
        $GenreLookup[65]   = 'Cabaret';
        $GenreLookup[66]   = 'New Wave';
        $GenreLookup[67]   = 'Psychadelic';
        $GenreLookup[68]   = 'Rave';
        $GenreLookup[69]   = 'Showtunes';
        $GenreLookup[70]   = 'Trailer';
        $GenreLookup[71]   = 'Lo-Fi';
        $GenreLookup[72]   = 'Tribal';
        $GenreLookup[73]   = 'Acid Punk';
        $GenreLookup[74]   = 'Acid Jazz';
        $GenreLookup[75]   = 'Polka';
        $GenreLookup[76]   = 'Retro';
        $GenreLookup[77]   = 'Musical';
        $GenreLookup[78]   = 'Rock & Roll';
        $GenreLookup[79]   = 'Hard Rock';
        $GenreLookup[80]   = 'Folk';
        $GenreLookup[81]   = 'Folk/Rock';
        $GenreLookup[82]   = 'National Folk';
        $GenreLookup[83]   = 'Swing';
        $GenreLookup[84]   = 'Fast-Fusion';
        $GenreLookup[85]   = 'Bebob';
        $GenreLookup[86]   = 'Latin';
        $GenreLookup[87]   = 'Revival';
        $GenreLookup[88]   = 'Celtic';
        $GenreLookup[89]   = 'Bluegrass';
        $GenreLookup[90]   = 'Avantgarde';
        $GenreLookup[91]   = 'Gothic Rock';
        $GenreLookup[92]   = 'Progressive Rock';
        $GenreLookup[93]   = 'Psychedelic Rock';
        $GenreLookup[94]   = 'Symphonic Rock';
        $GenreLookup[95]   = 'Slow Rock';
        $GenreLookup[96]   = 'Big Band';
        $GenreLookup[97]   = 'Chorus';
        $GenreLookup[98]   = 'Easy Listening';
        $GenreLookup[99]   = 'Acoustic';
        $GenreLookup[100]  = 'Humour';
        $GenreLookup[101]  = 'Speech';
        $GenreLookup[102]  = 'Chanson';
        $GenreLookup[103]  = 'Opera';
        $GenreLookup[104]  = 'Chamber Music';
        $GenreLookup[105]  = 'Sonata';
        $GenreLookup[106]  = 'Symphony';
        $GenreLookup[107]  = 'Booty Bass';
        $GenreLookup[108]  = 'Primus';
        $GenreLookup[109]  = 'Porn Groove';
        $GenreLookup[110]  = 'Satire';
        $GenreLookup[111]  = 'Slow Jam';
        $GenreLookup[112]  = 'Club';
        $GenreLookup[113]  = 'Tango';
        $GenreLookup[114]  = 'Samba';
        $GenreLookup[115]  = 'Folklore';
        $GenreLookup[116]  = 'Ballad';
        $GenreLookup[117]  = 'Power Ballad';
        $GenreLookup[118]  = 'Rhythmic Soul';
        $GenreLookup[119]  = 'Freestyle';
        $GenreLookup[120]  = 'Duet';
        $GenreLookup[121]  = 'Punk Rock';
        $GenreLookup[122]  = 'Drum Solo';
        $GenreLookup[123]  = 'A Cappella';
        $GenreLookup[124]  = 'Euro-House';
        $GenreLookup[125]  = 'Dance Hall';
        $GenreLookup[126]  = 'Goa';
        $GenreLookup[127]  = 'Drum & Bass';
        $GenreLookup[128]  = 'Club-House';
        $GenreLookup[129]  = 'Hardcore';
        $GenreLookup[130]  = 'Terror';
        $GenreLookup[131]  = 'Indie';
        $GenreLookup[132]  = 'BritPop';
        $GenreLookup[133]  = 'Negerpunk';
        $GenreLookup[134]  = 'Polsk Punk';
        $GenreLookup[135]  = 'Beat';
        $GenreLookup[136]  = 'Christian Gangsta Rap';
        $GenreLookup[137]  = 'Heavy Metal';
        $GenreLookup[138]  = 'Black Metal';
        $GenreLookup[139]  = 'Crossover';
        $GenreLookup[140]  = 'Contemporary Christian';
        $GenreLookup[141]  = 'Christian Rock';
        $GenreLookup[142]  = 'Merengue';
        $GenreLookup[143]  = 'Salsa';
        $GenreLookup[144]  = 'Trash Metal';
        $GenreLookup[145]  = 'Anime';
        $GenreLookup[146]  = 'Jpop';
        $GenreLookup[147]  = 'Synthpop';
        $GenreLookup[255]  = 'Unknown';

        $GenreLookup['CR'] = 'Cover';
        $GenreLookup['RX'] = 'Remix';
    }
    return $GenreLookup;
}

function get_id3v1($fd,$ThisFileInfo) {
    rewind($fd);
    @fseek($fd, -128, SEEK_END);
    $line = @fread($fd, 10000);
    if(preg_match("/^TAG/", $line)) {
        $id3_genres_array = ArrayOfGenres();
        $ThisFileInfo['id3v1']['title']   = trim(substr($line,   3, 30));
        $ThisFileInfo['id3v1']['artist']  = trim(substr($line,  33, 30));
        $ThisFileInfo['id3v1']['album']   = trim(substr($line,  63, 30));
        $ThisFileInfo['id3v1']['year']    = trim(substr($line,  93,  4));
        $ThisFileInfo['id3v1']['comment'] =      substr($line,  97, 30); // can't remove nulls yet, track detection depends on them
        $ThisFileInfo['id3v1']['genreid'] =  ord(substr($line, 127,  1));
        if (($ThisFileInfo['id3v1']['genreid'] != 'RX') && ($ThisFileInfo['id3v1']['genreid'] === 'CR')) {
            $ThisFileInfo['id3v1']['genreid'] = (int) $ThisFileInfo['id3v1']['genreid']; // to handle 3 or '3' or '03'
        }
        if ((substr($ThisFileInfo['id3v1']['comment'], 28, 1) === chr(0)) && (substr($ThisFileInfo['id3v1']['comment'], 29, 1) !== chr(0))) {
            $ThisFileInfo['id3v1']['track'] = ord(substr($ThisFileInfo['id3v1']['comment'], 29, 1));
            $ThisFileInfo['id3v1']['comment'] = substr($ThisFileInfo['id3v1']['comment'], 0, 28);
        }
        $ThisFileInfo['id3v1']['comment'] = trim($ThisFileInfo['id3v1']['comment']);
        $ThisFileInfo['id3v1']['genre'] = $id3_genres_array[$ThisFileInfo['id3v1']['genreid']];
        //return 
        
    } else {
        $ThisFileInfo['error'][1]= "No ID3v1";
    }
    return $ThisFileInfo;
    
}

$ThisFileInfo['filename'] = "je_mp3_file.mp3";
$fd = @fopen($ThisFileInfo['filename'],"r");
$ThisFileInfo = get_id3v2($fd,$ThisFileInfo);

inno


  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

Mja... voortaan geen (onleesbare) topics van 2000 meer kicken, ajb :) Mocht je het de moeite vinden, kun je voor dit soort dingen best zelf een topic openen.

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz

Pagina: 1

Dit topic is gesloten.