Archiv verlassen und diese Seite im Standarddesign anzeigen : MP3 Header einlesen !! (problem)
DarkMight0 01-02-2003, 11:05 Ich versuche gerade den Header einer MP3-Datei einzulesen um heraus zu finden welche Bitrate das File hat.
<?php
$handle=opendir(".\\upload\\");
while ($filename = readdir ($handle))
{
if ($filename != "." && $filename != "..")
{
echo "$filename \n";
$file_handle = fopen (".\\upload\\".$filename, "rb");
// 1. Byte als integer ausgeben
$header_byte = fread ($file_handle, 1);
settype($header_byte, "integer");
echo $header_byte;
echo "<br>\n";
fclose ($file_handle);
}
}
closedir($handle);
?>
Mein Problem ist jetzt nur das als integerwert für das erste Byte immer 0 ausgibt. Das erste Byte einer MP3-datei sehen aber so aus: FF
Wie man nun weiß entspicht FF dem Dezimalwert 255.
Kann mir jemand einen Tip geben was ich da falsch mache ???
mrhappiness 01-02-2003, 11:16 $file_handle = fopen (".upload".$filename, "rb");
muss das nicht so heißen:
$file_handle = fopen ('.\upload\\'.$filename, 'rb');<?php
$handle=opendir('.\\upload');
while ($filename = readdir ($handle))
{
if ($filename != '.' && $filename != '..')
{
echo "$filename n";
$file_handle = fopen ('.\\upload\\\\'.$filename, 'rb');
if (!$file_handle)
{
echo 'Datei konnte nicht geöffnet werden.<br />';
continue;
}
// 1. Byte als integer ausgeben
$header_byte = fread ($file_handle, 1);
settype($header_byte, "integer");
echo $header_byte;
echo "<br>n";
fclose ($file_handle);
}
}
closedir($handle);
?>
martin_de 01-02-2003, 11:30 mir ist nicht klar, weshalb du settype() verwendest.
settype($header_byte, "integer");
was soll das bringen?
hier wird irgendein numerischer wert erwartet, 'FF' ist aber keiner, deshalb wird 0 zurückgegeben.
mrhappiness 01-02-2003, 11:38 ich denke eher nicht, dass es daran liegt. Er liest ja auch nur ein Zeichen, also kann maximal ein F drinstehen, was allerdings 0 ergibt.
mach doch vor dem (imo unnötigen) umwandeln per settype das hier: echo '---'.$header_byte.'---'; Was steht da für ne Zahl?
DarkMight0 01-02-2003, 13:19 also wenn ich das settype nicht mache bekomme ich folgendes Zeichen :
ÿ
ich hatte eigentlich gedacht das settype mir den ASCII-Code des Chars liefert, denn dieser währe 255 !!!
Und übrigens mit FF ist der HEX-Code des ersten Bytes gemeint.
$file_handle = fopen (".upload".$filename, "rb");
muss das nicht so heißen:
$file_handle = fopen ('.\upload\'.$filename, 'rb');
Ja das muss so heissen nur hat das Forum den Code leider verändert und den \\ gelöscht !!
mrhappiness 01-02-2003, 13:23 Ord (www.php.net/manual/de/function.ord.php) is das was du suchst
Original geschrieben von mrhappiness
ich denke eher nicht, dass es daran liegt. Er liest ja auch nur ein Zeichen, also kann maximal ein F drinstehen, was allerdings 0 ergibt.
nee, happy, das ist quatsch...
das dateisystem arbeitet mit 8 bit = 1 byte gleich wertebereich 0 bis 255.
wenn du dir mal eine datei in einem hex-editor ansiehst, werden dort die einzelnen bytes ja auch mit zwei zeichen angezeigt, weil 0 bis 255 hexadezimal nun mal 00 bis ff entspricht.
mrhappiness 01-02-2003, 14:31 Original geschrieben von martin_de
settype($header_byte, "integer");
...
hier wird irgendein numerischer wert erwartet, 'FF' ist aber keiner, deshalb wird 0 zurückgegeben. ich bezog mich dadrauf und das fread($file_handle,1);
wollte bloß klarmachen, dass in $header_byte nich zweimal der buchstabe F drinsteht
wollte bloß klarmachen, dass in $header_byte nich zweimal der buchstabe F drinsteht
ach so.
aber eigentlich doch - kommt nur drauf an, in welchem format du dir das byte anzeigen lässt *g*
mrhappiness 01-02-2003, 14:44 *g* auch wieder wahr
aber dann steht in der variablen ja auch 0377 drin :D
DarkMight0 01-02-2003, 15:59 @ mrhappiness
ord() war genau die funktion die ich brauchte
So jetzt habe ich die ersten 32 Bits als String jetzt muss ich den String nur wieder teilen und zwar in 12 , 1 , 2 , 1 , 4 , 2 , 1 , 1 , 2 , 2 , 1 , 1 und 2 byte lange Strings.
Gibt es da auch eine nützliche Funktion oder muss ich das alles per 'Hand machen.
mrhappiness 01-02-2003, 16:05 wenn es da ein einheitliches trennzeichen gibt, kannst du die ersten 32bit als ganzes nehmen und dann exploden$teile=explode($trennzeichen,$die32bit);
DarkMight0 01-02-2003, 16:26 Es gibt leider gar kein trennzeichen den der String sieht z.B. so aus:
11111111111110111001001001000000
ich müßte das ganze jetzt folgendermassen aufsplitten :
111111111111 1 01 1 1001 00 1 0 01 00 0 0 00
Später nuss ich diese Teile wieder mit bindec() in eine Dezimalzahl umwandeln.
mrhappiness 01-02-2003, 16:28 dann wünsch ich dir viel spaß mit substr (php.net/manual/de/function.substr.php) *g*
DarkMight0 01-02-2003, 20:58 So ich habe das Script fertig gestellt und es mal in das andere Forum gepostet.
MP3 Header einlesen (lösung) (http://www.php-resource.de/forum/showthread.php?s=&postid=94305#post94305)
|
-
- |