home *** CD-ROM | disk | FTP | other *** search
/ H4CK3R 4 / hacker04 / 04_HACK04.ISO / src / PHP / mp3info.php3.txt < prev    next >
Encoding:
Text File  |  2002-05-06  |  16.6 KB  |  624 lines

  1. Mp3 Info Function 
  2.  
  3. This function returns MP3 file info as an array. It is extremely new code so it may not be 100% stable. 
  4.  
  5.  
  6.  
  7. <?php 
  8.  
  9. // 
  10. // This code made possible by Jim Beam black label bourbon. 
  11. // and the info found on http://www.dv.co.yu/mpgscript/mpeghdr.htm . 
  12. // 
  13. // Coded by Chester@hackster.com 
  14. // 
  15. // Returns a single demensional array.  
  16. // 
  17. // filename,filesize,length in seconds,bitrate,sample rate,channel mode,mpeg version,layer,crc,copyright,original 
  18. // 
  19. // Enjoy... Oh BTW this code REALLY sucks 
  20. // 
  21.  
  22. function padd (&$inf) 
  23.  
  24. // Dodgy ass function to pad binary strings so they represent the correct 8 bits. 
  25.      
  26.     { 
  27.         while (strlen($inf)<8) 
  28.             { 
  29.                 $inf =  "0".$inf; 
  30.             } 
  31.     } 
  32.  
  33. function js_alert($msg)  
  34.  
  35. // Function to spit out little window when an error occur's 
  36.  
  37. echo ( 
  38. "\n<script language='javascript'>\n" . 
  39. "    <!-- \n" . 
  40. "    alert (\"$msg\");\n" . 
  41. "    // --> \n" . 
  42. "</script>\n" 
  43. ); 
  44.      
  45. function mp3info($filename) 
  46.  
  47.  
  48. // Ensure file exists! 
  49.      
  50. if (!$file = fopen($filename, "rb")) 
  51.     { 
  52.         js_alert( 'Yo I cant find\\n$filename'); 
  53.         exit; 
  54.     } 
  55.  
  56. // Checking to make sure I can find Frame Sync 
  57.  
  58. while (!feof($file)) 
  59.     { 
  60.         $tmp=fgetc($file); 
  61.         if (ord($tmp)==255) 
  62.             { 
  63.                 $tmp=fgetc($file); 
  64.                 if (substr((decbin(ord($tmp))),0,3)== "111") 
  65.                     { 
  66.                         break; 
  67.                     } 
  68.             } 
  69.     } 
  70.  
  71. // If end of file is reached before Frame Sync is found then bail... 
  72.  
  73. if (feof($file)) 
  74.     { 
  75.         js_alert( 'Ummmm are you sure this is a MP3 ??'); 
  76.         fclose($file); 
  77.         return(1); 
  78.     } 
  79.  
  80. // We have declared all engines go. 
  81.  
  82. // Assign filesize 
  83.  
  84. $filesize=filesize($filename); 
  85.  
  86. // Assign all important information to $bitstream variable. 
  87.  
  88. $inf=decbin(ord($tmp)); 
  89. padd($inf); 
  90. $bitstream = $inf; 
  91. $tmp=fgetc($file); 
  92. $inf=decbin(ord($tmp)); 
  93. padd($inf); 
  94. $bitstream = $bitstream.$inf; 
  95. $tmp=fgetc($file); 
  96. $inf=decbin(ord($tmp)); 
  97. padd($inf); 
  98. $bitstream = $bitstream.$inf; 
  99.  
  100. // $bitstream now totals the 3 important bytes of the header of this frame. 
  101.  
  102. // Determine Version of Mpeg. 
  103.  
  104. switch (substr($bitstream,3,2)) 
  105.     { 
  106.         case  "00": 
  107.             $version= "2.5"; 
  108.             break; 
  109.         case  "01": 
  110.             $version= "0"; 
  111.             break; 
  112.         case  "10": 
  113.             $version= "2"; 
  114.             break; 
  115.         case  "11": 
  116.             $version= "1"; 
  117.             break; 
  118.     } 
  119.  
  120. // Determine Layer. 
  121.  
  122. switch (substr($bitstream,5,2)) 
  123.     { 
  124.         case  "00": 
  125.             $layer= "0"; 
  126.             break; 
  127.         case  "01": 
  128.             $layer= "3"; 
  129.             break; 
  130.         case  "10": 
  131.             $layer= "2"; 
  132.             break; 
  133.         case  "11": 
  134.             $layer= "1"; 
  135.             break; 
  136.     } 
  137.  
  138. // Determine CRC checking enabled / disabled 1==disabled 
  139.  
  140. $crc = substr($bitstream,7,1); 
  141.  
  142. // Determine Bitrate 
  143.  
  144. // Setting an index variable ... trust me in this state tis the only way I can think of doing it... 
  145.  
  146. if (($version== "1")&($layer== "1")) 
  147.     { 
  148.         $index= "1"; 
  149.     } 
  150. elseif (($version== "1")&($layer== "2")) 
  151.     { 
  152.         $index= "2"; 
  153.     } 
  154. elseif ($version== "1") 
  155.     { 
  156.         $index= "3"; 
  157.     } 
  158. elseif ($layer== "1") 
  159.     { 
  160.         $index= "4"; 
  161.     } 
  162. else     
  163.     { 
  164.         $index= "5"; 
  165.     } 
  166.  
  167. switch (substr($bitstream,8,4)) 
  168.     { 
  169.         case  "0000": 
  170.             $bitrate= "free"; 
  171.             break; 
  172.         case  "0001": 
  173.             if (($layer>1)and($version>1)) 
  174.                 { 
  175.                     $bitrate= "8000"; 
  176.                 } 
  177.             else 
  178.                 { 
  179.                     $bitrate= "32000"; 
  180.                 } 
  181.             break; 
  182.         case  "0010": 
  183.             switch ($index) 
  184.                 { 
  185.                     case  "1": 
  186.                         $bitrate= "64000"; 
  187.                         break; 
  188.                     case  "2": 
  189.                         $bitrate= "48000"; 
  190.                         break; 
  191.                     case  "3": 
  192.                         $bitrate= "40000"; 
  193.                         break; 
  194.                     case  "4": 
  195.                         $bitrate= "48000"; 
  196.                         break; 
  197.                     case  "5": 
  198.                         $bitrate= "16000"; 
  199.                         break; 
  200.                 } 
  201.             break; 
  202.         case  "0011": 
  203.             switch ($index) 
  204.                 { 
  205.                     case  "1": 
  206.                         $bitrate= "96000"; 
  207.                         break; 
  208.                     case  "2": 
  209.                         $bitrate= "56000"; 
  210.                         break; 
  211.                     case  "3": 
  212.                         $bitrate= "48000"; 
  213.                         break; 
  214.                     case  "4": 
  215.                         $bitrate= "56000"; 
  216.                         break; 
  217.                     case  "5": 
  218.                         $bitrate= "24000"; 
  219.                         break; 
  220.                 } 
  221.             break; 
  222.         case  "0100": 
  223.             switch ($index) 
  224.                 { 
  225.                     case  "1": 
  226.                         $bitrate= "128000"; 
  227.                         break; 
  228.                     case  "2": 
  229.                         $bitrate= "64000"; 
  230.                         break; 
  231.                     case  "3": 
  232.                         $bitrate= "56000"; 
  233.                         break; 
  234.                     case  "4": 
  235.                         $bitrate= "64000"; 
  236.                         break; 
  237.                     case  "5": 
  238.                         $bitrate= "32000"; 
  239.                         break; 
  240.                 } 
  241.             break; 
  242.         case  "0101": 
  243.             switch ($index) 
  244.                 { 
  245.                     case  "1": 
  246.                         $bitrate= "160000"; 
  247.                         break; 
  248.                     case  "2": 
  249.                         $bitrate= "80000"; 
  250.                         break; 
  251.                     case  "3": 
  252.                         $bitrate= "64000"; 
  253.                         break; 
  254.                     case  "4": 
  255.                         $bitrate= "80000"; 
  256.                         break; 
  257.                     case  "5": 
  258.                         $bitrate= "40000"; 
  259.                         break; 
  260.                 } 
  261.             break; 
  262.         case  "0110": 
  263.             switch ($index) 
  264.                 { 
  265.                     case  "1": 
  266.                         $bitrate= "192000"; 
  267.                         break; 
  268.                     case  "2": 
  269.                         $bitrate= "96000"; 
  270.                         break; 
  271.                     case  "3": 
  272.                         $bitrate= "80000"; 
  273.                         break; 
  274.                     case  "4": 
  275.                         $bitrate= "96000"; 
  276.                         break; 
  277.                     case  "5": 
  278.                         $bitrate= "48000"; 
  279.                         break; 
  280.                 } 
  281.             break; 
  282.         case  "0111": 
  283.             switch ($index) 
  284.                 { 
  285.                     case  "1": 
  286.                         $bitrate= "224000"; 
  287.                         break; 
  288.                     case  "2": 
  289.                         $bitrate= "112000"; 
  290.                         break; 
  291.                     case  "3": 
  292.                         $bitrate= "96000"; 
  293.                         break; 
  294.                     case  "4": 
  295.                         $bitrate= "112000"; 
  296.                         break; 
  297.                     case  "5": 
  298.                         $bitrate= "56000"; 
  299.                         break; 
  300.                 } 
  301.             break; 
  302.         case  "1000": 
  303.             switch ($index) 
  304.                 { 
  305.                     case  "1": 
  306.                         $bitrate= "256000"; 
  307.                         break; 
  308.                     case  "2": 
  309.                         $bitrate= "128000"; 
  310.                         break; 
  311.                     case  "3": 
  312.                         $bitrate= "112000"; 
  313.                         break; 
  314.                     case  "4": 
  315.                         $bitrate= "128000"; 
  316.                         break; 
  317.                     case  "5": 
  318.                         $bitrate= "64000"; 
  319.                         break; 
  320.                 } 
  321.             break; 
  322.         case  "1001": 
  323.             switch ($index) 
  324.                 { 
  325.                     case  "1": 
  326.                         $bitrate= "288000"; 
  327.                         break; 
  328.                     case  "2": 
  329.                         $bitrate= "160000"; 
  330.                         break; 
  331.                     case  "3": 
  332.                         $bitrate= "128000"; 
  333.                         break; 
  334.                     case  "4": 
  335.                         $bitrate= "144000"; 
  336.                         break; 
  337.                     case  "5": 
  338.                         $bitrate= "80000"; 
  339.                         break; 
  340.                 } 
  341.             break; 
  342.         case  "1010": 
  343.             switch ($index) 
  344.                 { 
  345.                     case  "1": 
  346.                         $bitrate= "320000"; 
  347.                         break; 
  348.                     case  "2": 
  349.                         $bitrate= "192000"; 
  350.                         break; 
  351.                     case  "3": 
  352.                         $bitrate= "160000"; 
  353.                         break; 
  354.                     case  "4": 
  355.                         $bitrate= "160000"; 
  356.                         break; 
  357.                     case  "5": 
  358.                         $bitrate= "96000"; 
  359.                         break; 
  360.                 } 
  361.             break; 
  362.         case  "1011": 
  363.             switch ($index) 
  364.                 { 
  365.                     case  "1": 
  366.                         $bitrate= "352000"; 
  367.                         break; 
  368.                     case  "2": 
  369.                         $bitrate= "224000"; 
  370.                         break; 
  371.                     case  "3": 
  372.                         $bitrate= "192000"; 
  373.                         break; 
  374.                     case  "4": 
  375.                         $bitrate= "176000"; 
  376.                         break; 
  377.                     case  "5": 
  378.                         $bitrate= "112000"; 
  379.                         break; 
  380.                 } 
  381.             break; 
  382.         case  "1100": 
  383.             switch ($index) 
  384.                 { 
  385.                     case  "1": 
  386.                         $bitrate= "384000"; 
  387.                         break; 
  388.                     case  "2": 
  389.                         $bitrate= "256000"; 
  390.                         break; 
  391.                     case  "3": 
  392.                         $bitrate= "224000"; 
  393.                         break; 
  394.                     case  "4": 
  395.                         $bitrate= "192000"; 
  396.                         break; 
  397.                     case  "5": 
  398.                         $bitrate= "128000"; 
  399.                         break; 
  400.                 } 
  401.             break; 
  402.         case  "1101": 
  403.             switch ($index) 
  404.                 { 
  405.                     case  "1": 
  406.                         $bitrate= "416000"; 
  407.                         break; 
  408.                     case  "2": 
  409.                         $bitrate= "320000"; 
  410.                         break; 
  411.                     case  "3": 
  412.                         $bitrate= "256000"; 
  413.                         break; 
  414.                     case  "4": 
  415.                         $bitrate= "224000"; 
  416.                         break; 
  417.                     case  "5": 
  418.                         $bitrate= "144000"; 
  419.                         break; 
  420.                 } 
  421.             break; 
  422.         case  "1110": 
  423.             switch ($index) 
  424.                 { 
  425.                     case  "1": 
  426.                         $bitrate= "448000"; 
  427.                         break; 
  428.                     case  "2": 
  429.                         $bitrate= "384000"; 
  430.                         break; 
  431.                     case  "3": 
  432.                         $bitrate= "320000"; 
  433.                         break; 
  434.                     case  "4": 
  435.                         $bitrate= "256000"; 
  436.                         break; 
  437.                     case  "5": 
  438.                         $bitrate= "160000"; 
  439.                         break; 
  440.                 } 
  441.             break; 
  442.         case  "1111": 
  443.             $bitrate= "bad"; 
  444.             break; 
  445.     } 
  446.  
  447. // Determine Sample Rate 
  448.  
  449. switch ($version) 
  450.     { 
  451.         case  "1": 
  452.             switch (substr($bitstream,12,2)) 
  453.                 { 
  454.                     case  "00": 
  455.                         $sample= "44100"; 
  456.                         break; 
  457.                     case  "01": 
  458.                         $sample= "48000"; 
  459.                         break; 
  460.                     case  "10": 
  461.                         $sample= "32000"; 
  462.                         break; 
  463.                     case  "11": 
  464.                         $sample= "reserved"; 
  465.                         break; 
  466.                 } 
  467.             break; 
  468.         case  "2": 
  469.             switch (substr($bitstream,12,2)) 
  470.                 { 
  471.                     case  "00": 
  472.                         $sample= "22050"; 
  473.                         break; 
  474.                     case  "01": 
  475.                         $sample= "24000"; 
  476.                         break; 
  477.                     case  "10": 
  478.                         $sample= "16000"; 
  479.                         break; 
  480.                     case  "11": 
  481.                         $sample= "reserved"; 
  482.                         break; 
  483.                 } 
  484.             break; 
  485.         case  "2.5": 
  486.             switch (substr($bitstream,12,2)) 
  487.                 { 
  488.                     case  "00": 
  489.                         $sample= "11025"; 
  490.                         break; 
  491.                     case  "01": 
  492.                         $sample= "12000"; 
  493.                         break; 
  494.                     case  "10": 
  495.                         $sample= "8000"; 
  496.                         break; 
  497.                     case  "11": 
  498.                         $sample= "reserved"; 
  499.                         break; 
  500.                 } 
  501.             break; 
  502.     } 
  503.  
  504. // Determine whether padding is set on. 0 == no & 1 == yes 
  505.  
  506. $padding = substr($bitstream,14,1); 
  507.  
  508. // Determine the private bit's value. Dont know what for though? 
  509.  
  510. $private = substr($bitstream,15,1); 
  511.  
  512. // Determine Channel mode 
  513.  
  514. switch (substr($bitstream,16,2)) 
  515.     { 
  516.         case  "00": 
  517.             $cmode= "Stereo"; 
  518.             break; 
  519.         case  "01": 
  520.             $cmode= "Joint Stereo"; 
  521.             break; 
  522.         case  "10": 
  523.             $cmode= "Dual Channel"; 
  524.             break; 
  525.         case  "11": 
  526.             $cmode= "Mono"; 
  527.             break; 
  528.     } 
  529.      
  530. /* 
  531.  
  532. // Determine Mode Extension, actually who cares for the moment 
  533.  
  534. switch (substr($bitstream,18,2)) 
  535.     { 
  536.         case "00": 
  537.             $mext="0"; 
  538.             break; 
  539.         case "01": 
  540.             $mext="3"; 
  541.             break; 
  542.         case "10": 
  543.             $mext="2"; 
  544.             break; 
  545.         case "11": 
  546.             $mext="1"; 
  547.             break; 
  548.     } 
  549.  
  550. */ 
  551.      
  552. // Determine Copyright 0 == no & 1 == yes 
  553.  
  554. $copyright = substr($bitstream,20,1); 
  555.  
  556. // Determine Original 0 == Copy & 1 == Original 
  557.  
  558. $original = substr($bitstream,21,1); 
  559.  
  560. // Determine Emphasis 
  561.  
  562. switch (substr($bitstream,22,2)) 
  563.     { 
  564.         case  "00": 
  565.             $emphasis= "none"; 
  566.             break; 
  567.         case  "01": 
  568.             $emphasis= "50/15 ms"; 
  569.             break; 
  570.         case  "10": 
  571.             $emphasis= "reserved"; 
  572.             break; 
  573.         case  "11": 
  574.             $emphasis= "CCIT J.17"; 
  575.             break; 
  576.     } 
  577.  
  578. // Determine number of frames. 
  579.  
  580. if ((isset($sample)) and (isset($bitrate))) 
  581. if ($layer== "1") 
  582.     { 
  583.         $frames=floor($filesize/(floor(((12*$bitrate)/($sample+$padding))*4)));     
  584.     } 
  585. else 
  586.     { 
  587.         $frames=floor($filesize/(floor((144*$bitrate)/($sample)))); 
  588.     } 
  589.      
  590. // Determine number of seconds in song. 
  591.  
  592. if ($layer== "1") 
  593.     { 
  594.         $seconds=floor((384/$sample)*$frames); 
  595.     } 
  596. else 
  597.     { 
  598.         $seconds=floor((1152/$sample)*$frames); 
  599.     } 
  600. fclose($file); 
  601.  
  602. $fred[]=$filename; 
  603. $fred[]=$filesize; 
  604. $fred[]=$seconds; 
  605. $fred[]=$bitrate; 
  606. $fred[]=$sample; 
  607. $fred[]=$cmode; 
  608. $fred[]=$version; 
  609. $fred[]=$layer; 
  610. $fred[]=$crc; 
  611. $fred[]=$copyright; 
  612. $fred[]=$original; 
  613.  
  614. return($fred); 
  615.  
  616.  
  617. ?>
  618.