说实在话,teaman还没有看懂,但感觉这东西不错。
<?php
// 这个代码的作用是:
//返回MP3的文件名、文件尺寸、播放时间、版权信息等等
//你自己看吧,teaman懒翻了。
function padd (&$inf)
// Dodgy 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 wh
// en 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 Fram
// e 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 Fram
// e 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 / disa
// bled 1==disabled
$crc = substr($bitstream,7,1);
// Determine Bitrate
// Setting an index variable ... trust m
// e in this state tis the only way I can t
// hink 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. Do
// nt 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 wh
// o 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 == ye
// s
$copyright = substr($bitstream,20,1);
// Determine Original 0 == Copy & 1 == O
// riginal
$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);
}
?>
|