MP3 info
Informácie o MP3 súbore načítané v PHP
<? // // This code made possible by Jim Beam black label bourbon. // and the info found on http://www.dv.co.yu/mpgscript/mpeghdr.htm . // // Coded by Chester@hackster.com // // Returns a single demensional array. // // filename,filesize,length in seconds,bitrate,sample rate,channel mode,mpeg version,layer,crc,copyright,original // // Enjoy... Oh BTW this code REALLY sucks // function padd (&$inf) // Dodgy ass function to pad binary strings so they represent the correct 8 bits. { while (strlen($inf)<8) { $inf = "0".$inf; } } function js_alert($msg) // Function to spit out little window when an error occur's { echo ( "\n<script language='javascript'>\n" . " <!-- \n" . " alert (\"$msg\");\n" . " // --> \n" . "</script>\n" ); } function mp3info($filename) { // Ensure file exists! if (!$file = fopen($filename,"rb")) { js_alert('Yo I cant find\\n$filename'); exit; } // Checking to make sure I can find Frame Sync while (!feof($file)) { $tmp=fgetc($file); if (ord($tmp)==255) { $tmp=fgetc($file); if (substr((decbin(ord($tmp))),0,3)=="111") { break; } } } // If end of file is reached before Frame Sync is found then bail... if (feof($file)) { js_alert('Ummmm are you sure this is a MP3 ??'); fclose($file); return(1); } // We have declared all engines go. // Assign filesize $filesize=filesize($filename); // Assign all important information to $bitstream variable. $inf=decbin(ord($tmp)); padd($inf); $bitstream = $inf; $tmp=fgetc($file); $inf=decbin(ord($tmp)); padd($inf); $bitstream = $bitstream.$inf; $tmp=fgetc($file); $inf=decbin(ord($tmp)); padd($inf); $bitstream = $bitstream.$inf; // $bitstream now totals the 3 important bytes of the header of this frame. // Determine Version of Mpeg. switch (substr($bitstream,3,2)) { case "00": $version="2.5"; break; case "01": $version="0"; break; case "10": $version="2"; break; case "11": $version="1"; break; } // Determine Layer. switch (substr($bitstream,5,2)) { case "00": $layer="0"; break; case "01": $layer="3"; break; case "10": $layer="2"; break; case "11": $layer="1"; break; } // Determine CRC checking enabled / disabled 1==disabled $crc = substr($bitstream,7,1); // Determine Bitrate // Setting an index variable ... trust me in this state tis the only way I can think of doing it... if (($version=="1")&($layer=="1")) { $index="1"; } elseif (($version=="1")&($layer=="2")) { $index="2"; } elseif ($version=="1") { $index="3"; } elseif ($layer=="1") { $index="4"; } else { $index="5"; } switch (substr($bitstream,8,4)) { case "0000": $bitrate="free"; break; case "0001": if (($layer>1)and($version>1)) { $bitrate="8000"; } else { $bitrate="32000"; } break; case "0010": switch ($index) { case "1": $bitrate="64000"; break; case "2": $bitrate="48000"; break; case "3": $bitrate="40000"; break; case "4": $bitrate="48000"; break; case "5": $bitrate="16000"; break; } break; case "0011": switch ($index) { case "1": $bitrate="96000"; break; case "2": $bitrate="56000"; break; case "3": $bitrate="48000"; break; case "4": $bitrate="56000"; break; case "5": $bitrate="24000"; break; } break; case "0100": switch ($index) { case "1": $bitrate="128000"; break; case "2": $bitrate="64000"; break; case "3": $bitrate="56000"; break; case "4": $bitrate="64000"; break; case "5": $bitrate="32000"; break; } break; case "0101": switch ($index) { case "1": $bitrate="160000"; break; case "2": $bitrate="80000"; break; case "3": $bitrate="64000"; break; case "4": $bitrate="80000"; break; case "5": $bitrate="40000"; break; } break; case "0110": switch ($index) { case "1": $bitrate="192000"; break; case "2": $bitrate="96000"; break; case "3": $bitrate="80000"; break; case "4": $bitrate="96000"; break; case "5": $bitrate="48000"; break; } break; case "0111": switch ($index) { case "1": $bitrate="224000"; break; case "2": $bitrate="112000"; break; case "3": $bitrate="96000"; break; case "4": $bitrate="112000"; break; case "5": $bitrate="56000"; break; } break; case "1000": switch ($index) { case "1": $bitrate="256000"; break; case "2": $bitrate="128000"; break; case "3": $bitrate="112000"; break; case "4": $bitrate="128000"; break; case "5": $bitrate="64000"; break; } break; case "1001": switch ($index) { case "1": $bitrate="288000"; break; case "2": $bitrate="160000"; break; case "3": $bitrate="128000"; break; case "4": $bitrate="144000"; break; case "5": $bitrate="80000"; break; } break; case "1010": switch ($index) { case "1": $bitrate="320000"; break; case "2": $bitrate="192000"; break; case "3": $bitrate="160000"; break; case "4": $bitrate="160000"; break; case "5": $bitrate="96000"; break; } break; case "1011": switch ($index) { case "1": $bitrate="352000"; break; case "2": $bitrate="224000"; break; case "3": $bitrate="192000"; break; case "4": $bitrate="176000"; break; case "5": $bitrate="112000"; break; } break; case "1100": switch ($index) { case "1": $bitrate="384000"; break; case "2": $bitrate="256000"; break; case "3": $bitrate="224000"; break; case "4": $bitrate="192000"; break; case "5": $bitrate="128000"; break; } break; case "1101": switch ($index) { case "1": $bitrate="416000"; break; case "2": $bitrate="320000"; break; case "3": $bitrate="256000"; break; case "4": $bitrate="224000"; break; case "5": $bitrate="144000"; break; } break; case "1110": switch ($index) { case "1": $bitrate="448000"; break; case "2": $bitrate="384000"; break; case "3": $bitrate="320000"; break; case "4": $bitrate="256000"; break; case "5": $bitrate="160000"; break; } break; case "1111": $bitrate="bad"; break; } // Determine Sample Rate switch ($version) { case "1": switch (substr($bitstream,12,2)) { case "00": $sample="44100"; break; case "01": $sample="48000"; break; case "10": $sample="32000"; break; case "11": $sample="reserved"; break; } break; case "2": switch (substr($bitstream,12,2)) { case "00": $sample="22050"; break; case "01": $sample="24000"; break; case "10": $sample="16000"; break; case "11": $sample="reserved"; break; } break; case "2.5": switch (substr($bitstream,12,2)) { case "00": $sample="11025"; break; case "01": $sample="12000"; break; case "10": $sample="8000"; break; case "11": $sample="reserved"; break; } break; } // Determine whether padding is set on. 0 == no & 1 == yes $padding = substr($bitstream,14,1); // Determine the private bit's value. Dont know what for though? $private = substr($bitstream,15,1); // Determine Channel mode switch (substr($bitstream,16,2)) { case "00": $cmode="Stereo"; break; case "01": $cmode="Joint Stereo"; break; case "10": $cmode="Dual Channel"; break; case "11": $cmode="Mono"; break; } /* // Determine Mode Extension, actually who cares for the moment switch (substr($bitstream,18,2)) { case "00": $mext="0"; break; case "01": $mext="3"; break; case "10": $mext="2"; break; case "11": $mext="1"; break; } */ // Determine Copyright 0 == no & 1 == yes $copyright = substr($bitstream,20,1); // Determine Original 0 == Copy & 1 == Original $original = substr($bitstream,21,1); // Determine Emphasis switch (substr($bitstream,22,2)) { case "00": $emphasis="none"; break; case "01": $emphasis="50/15 ms"; break; case "10": $emphasis="reserved"; break; case "11": $emphasis="CCIT J.17"; break; } // Determine number of frames. if ((isset($sample)) and (isset($bitrate))) { if ($layer=="1") { $frames=floor($filesize/(floor(((12*$bitrate)/($sample+$padding))*4))); } else { $frames=floor($filesize/(floor((144*$bitrate)/($sample)))); } // Determine number of seconds in song. if ($layer=="1") { $seconds=floor((384/$sample)*$frames); } else { $seconds=floor((1152/$sample)*$frames); } } fclose($file); $fred[]=$filename; $fred[]=$filesize; $fred[]=$seconds; $fred[]=$bitrate; $fred[]=$sample; $fred[]=$cmode; $fred[]=$version; $fred[]=$layer; $fred[]=$crc; $fred[]=$copyright; $fred[]=$original; return($fred); } ?>