View file system/mp3_wav.php

File size: 11.22Kb
<?php
class AudioFile
{
var $wave_id;
var $wave_type;
var $wave_compression;
var $wave_channels;
var $wave_framerate;
var $wave_byterate;
var $wave_bits;
var $wave_size;
var $wave_filename;
var $wave_length;

function mp3info()
{
$byte 			= array();
$version 		= array("MPEG Version 2.5",false,"MPEG Version 2 (ISO/IEC 13818-3)","MPEG Version 1 (ISO/IEC 11172-3)");
$version_bitrate	= array(1,false,1,0);
$version_sampling	= array(2,false,1,0);
$layer			= array(false,"Layer III","Layer II","Layer I");
$layer_bitrate		= array(false,2,1,0);
$layer_lengt		= array(false,1,1,0);
//$protection 		= array("Protected by CRC (16bit crc follows header)","Not protected");
$byterate		= array(
array(
array("free",32,64,96,128,160,192,224,256,288,320,352,384,416,448,"bad"),
array("free",32,48,56, 64, 80, 96,112,128,160,192,224,256,320,384,"bad"),
array("free",32,40,48, 56, 64, 80, 96,112,128,160,192,224,256,320,"bad")
),
array(
array("free",32,48,56, 64, 80, 96,112,128,144,160,176,192,224,256,"bad"),
array("free", 8,16,24, 32, 40, 48, 56, 64, 80, 96,112,128,144,160,"bad"),
array("free", 8,16,24, 32, 40, 48, 56, 64, 80, 96,112,128,144,160,"bad")
)
);
$samplingrate		= array(
array(44100,48000,32000,false),
array(22050,24000,16000,false),
array(11025,12000, 8000,false)
);
$cannel_mode	= array("Stereo","Joint stereo (Stereo)","Dual channel (Stereo)","Single channel (Mono)");

$footer = 0;
$header = 0;
$v1tag	= 0;
$fp = fopen($this->wave_filename,"r");
$tmp = fread($fp,3);
if($tmp == "ID3")
{
$tmp 	= ord(fread($fp,1));
$tmp2 	= ord(fread($fp,1));
$info["mpeg_id3v2_tag"]["version"] = "ID3v2.".$tmp.".".$tmp2;
$tmp 	= ord(fread($fp,1));
if($tmp & 128)$info["mpeg_id3v2_tag"]["flag"]["unsync"] = "set";
if($tmp & 64) $info["mpeg_id3v2_tag"]["flag"]["extended"] = "set";
if($tmp & 32) $info["mpeg_id3v2_tag"]["flag"]["experimental"] = "set";
if($tmp & 16)
{
$info["mpeg_id3v2_tag"]["flag"]["footer"] = "set";
$footer = 10;
}
$tmp 	= ord(fread($fp,1))& 127;
$tmp2 	= ord(fread($fp,1))& 127;
$tmp3	= ord(fread($fp,1))& 127;
$tmp4 	= ord(fread($fp,1))& 127;
$info["mpeg_id3v2_tag"]["header_lenght"] = ($tmp * 2097152) + ($tmp2 * 16384) + ($tmp3 * 128) + $tmp4 + 10 + $footer;
fseek ($fp,$info["mpeg_id3v2_tag"]["header_lenght"]);
$header = $info["mpeg_id3v2_tag"]["header_lenght"];
} else {
fseek ($fp,0);
$info["mpeg_id3v2_tag"] = false;
}

for ($x=0;$x<4;$x++)
{
$byte[$x] = ord(fread($fp,1));
}
fseek ($fp, -128 ,SEEK_END);
$TAG = fread($fp,128);
fclose($fp);

//id tag?-------------------------------

if(substr($TAG,0,3) == "TAG")
{
$v1tag = 128;
$info["mpeg_id3v1_tag"]["title"] 	= substr($TAG,3,30);
$info["mpeg_id3v1_tag"]["artist"] 	= substr($TAG,33,30);
$info["mpeg_id3v1_tag"]["album"] 	= substr($TAG,63,30);
$info["mpeg_id3v1_tag"]["year"] 	= substr($TAG,93,4);
$info["mpeg_id3v1_tag"]["comment"] 	= substr($TAG,97,30);
$info["mpeg_id3v1_tag"]["genre"]	= "";
$tmp = ord(substr($TAG,127,1));
if($tmp < count($genre))
{
$info["mpeg_id3v1_tag"]["genre"] = $genre[$tmp];
}
} else {
$info["mpeg_id3v1_tag"] = false;
}

//version-------------------------------

$tmp = $byte[1] & 24;
$tmp = $tmp >> 3;
$info_i["mpeg_version"] = $tmp;
$byte_v = $version_bitrate[$tmp];
$byte_vs = $version_sampling[$tmp];
$info["mpeg_version"] = $version[$tmp];

//layer---------------------------------

$tmp = $byte[1] & 6;
$tmp = $tmp >> 1;
$info_i["mpeg_layer"] = $tmp;
$byte_l = $layer_bitrate[$tmp];
$byte_len = $layer_lengt[$tmp];
$info["mpeg_layer"] = $layer[$tmp];

//bitrate-------------------------------

$tmp = $byte[2] & 240;
$tmp = $tmp >> 4;
$info_i["mpeg_bitrate"] = $tmp;
$info["mpeg_bitrate"] = $byterate[$byte_v][$byte_l][$tmp]." Кбит/сек";

//samplingrate--------------------------

$tmp = $byte[2] & 12;
$tmp = $tmp >> 2;
$info["mpeg_sampling_rate"] = $samplingrate[$byte_vs][$tmp];

//protection----------------------------

$tmp = $byte[1] & 1;
$info["mpeg_protection"] = $protection[$tmp];

//paddingbit----------------------------

$tmp = $byte[2] & 2;
$tmp = $tmp >> 1;
$byte_pad = $tmp;
$info["mpeg_padding_bit"] = $tmp;

//privatebit----------------------------

$tmp = $byte[2] & 1;
$byte_prv = $tmp;

//channel_mode--------------------------

$tmp = $byte[3] & 192;
$tmp = $tmp >> 6;
$info["mpeg_channel_mode"] = $cannel_mode[$tmp];

//copyright-----------------------------

$tmp = $byte[3] & 8;
$tmp = $tmp >> 3;
$info["mpeg_copyright"] = $copyright[$tmp];

//original------------------------------

$tmp = $byte[3] & 4;
$tmp = $tmp >> 2;
$info["mpeg_original"] = $original[$tmp];

//emphasis------------------------------

$tmp = $byte[3] & 3;
$info["mpeg_emphasis"] = $emphasis[$tmp];

//framelenght---------------------------

if($byte_len == 0)
{
$rate_tmp = $info["mpeg_bitrate"] * 1000;
$info["mpeg_framelenght"] = (12 * $rate_tmp / $info["mpeg_sampling_rate"] + $byte_pad) * 4 ;
} elseif($byte_len == 1) {
$rate_tmp = $info["mpeg_bitrate"] * 1000;
$info["mpeg_framelenght"] = 144 * $rate_tmp /
$info["mpeg_sampling_rate"] + $byte_pad;
}

//duration------------------------------

$tmp = filesize($this->wave_filename);
$tmp = $tmp - $header - 4 - $v1tag;

$tmp2 = 0;
if ($info["mpeg_bitrate"]<>0)
{
$tmp2 = ((8 * $tmp) / 1000) / $info["mpeg_bitrate"];
}
$info["mpeg_frames"]="";
if ($info["mpeg_framelenght"]<>0)
{
$info["mpeg_frames"] = floor($tmp/$info["mpeg_framelenght"]);
}
$tmp = $tmp * 8;
$info["mpeg_playtime"]="";
if ($rate_tmp<>0)
{
$info["mpeg_playtime"] = $tmp/$rate_tmp;
}
$info["mpeg_playtime"] = $tmp2;

// transfer the extracted data into classAudioFile-structure

$this->wave_id = "MPEG";
$this->wave_type = $info["mpeg_version"];
$this->wave_compression = $info["mpeg_layer"];
$this->wave_channels = $info["mpeg_channel_mode"];
$this->wave_framerate = $info["mpeg_sampling_rate"];
$this->wave_byterate = $info["mpeg_bitrate"];
$this->wave_bits = "n/a";
$this->wave_size = filesize($this->wave_filename);
$this->wave_length = $info["mpeg_playtime"];

$this->id3_tag = $info["mpeg_id3v1_tag"];

if ($this->id3_tag)
{
$this->id3_title = $info["mpeg_id3v1_tag"]["title"];
$this->id3_artist = $info["mpeg_id3v1_tag"]["artist"];
$this->id3_album = $info["mpeg_id3v1_tag"]["album"];
$this->id3_year = $info["mpeg_id3v1_tag"]["year"];
$this->id3_comment = $info["mpeg_id3v1_tag"]["comment"];
$this->id3_genre = $info["mpeg_id3v1_tag"]["genre"];
}
}


function longCalc ($b1,$b2,$b3,$b4,$mode)
{
$b1 = hexdec(bin2hex($b1));
$b2 = hexdec(bin2hex($b2));
$b3 = hexdec(bin2hex($b3));
$b4 = hexdec(bin2hex($b4));
if ($mode == 0)
{
return ($b1 + ($b2*256) + ($b3 * 65536) + ($b4 * 16777216));
} else {
return ($b4 + ($b3*256) + ($b2 * 65536) + ($b1 * 16777216));
}
}


function shortCalc ($b1,$b2,$mode)
{
$b1 = hexdec(bin2hex($b1));
$b2 = hexdec(bin2hex($b2));
if ($mode == 0)
{
return ($b1 + ($b2*256));
} else {
return ($b2 + ($b1*256));
}
}

function getCompression ($id)
{
if ($this->wave_id <> "MPEG")
{
$append = "($id)";
switch ($id)
{
case 0:  return ("unknown $append"); break;
case 1:  return ("pcm/uncompressed $append"); break;
case 2:  return ("microsoft adpcm $append"); break;
case 6:  return ("itu g.711 a-law $append"); break;
case 7:  return ("itu g.711 u-law $append"); break;
case 17:   return ("ima adpcm $append"); break;
case 20:   return ("itu g.723 adpcm (yamaha) $append"); break;
case 49:   return ("gsm 6.10 $append"); break;
case 64:   return ("itu g.721 adpcm $append"); break;
case 80:   return ("mpeg $append"); break;
case 65536:return ("experimental $append"); break;
default:   return ("not defined $append"); break;
}
} else {
return ($id);
}
}


function getSampleInfo(){
$valid = true;

if (strstr(strtoupper($this->wave_filename),"MP3"))
{
$this->mp3info ();
} else {

$this->wave_size = filesize ($this->wave_filename);
if ($this->wave_size > 16)
{
$file = fopen ($this->wave_filename,"r");
$chunk_id = fgetc($file) . fgetc($file) . fgetc($file) . fgetc($file);
$null = fgetc($file) . fgetc($file) . fgetc($file) . fgetc($file);
$chunk_id_2 = fgetc($file) . fgetc($file) . fgetc($file) . fgetc($file);
$this->wave_id = $chunk_id;
$this->wave_type = $chunk_id_2;
if (substr($chunk_id,0,2)=="PK")
{
// it's a ZIP-file

$this->wave_id = "ZIP";
$this->wave_type = "ZIP";
$this->valid = true;
} else {
if ($this->wave_id == "RIFF" && $this->wave_type == "WAVE")
{
// it's a Wave-File

$chunk_id = fgetc($file) . fgetc($file) . fgetc($file) . fgetc($file);
$chunk_size = $this->longCalc (fgetc($file) , fgetc($file) , fgetc($file) , fgetc($file),0);
if ($chunk_id == "fmt ")
{
$format_len = $chunk_size;
$this->wave_compression = $this->shortCalc (fgetc ($file), fgetc ($file),0);
$this->wave_channels = $this->shortCalc (fgetc ($file), fgetc ($file),0);
$this->wave_framerate = $this->longCalc (fgetc ($file), fgetc ($file), fgetc ($file), fgetc ($file),0);
$this->wave_byterate = $this->longCalc (fgetc ($file), fgetc ($file), fgetc ($file), fgetc ($file),0);
$null = fgetc($file) . fgetc($file);
$this->wave_bits = $this->shortCalc (fgetc ($file), fgetc ($file),0);
$read = 16;
if ($read < $format_len)
{
$extra_bytes = $this->shortCalc (fgetc ($file), fgetc ($file),1);
$j = 0;
while ($j < $extra_bytes && !feof($file))
{
$null = fgetc ($file);
$j++;
}
}
$chunk_id = fgetc($file) . fgetc($file) . fgetc($file) . fgetc($file);
$chunk_size = $this->longCalc (fgetc($file) , fgetc($file) , fgetc($file) , fgetc($file),0);
if ($chunk_id == "data")
{
$this->wave_length = (($chunk_size / $this->wave_channels) / ($this->wave_bits/8)) / $this->wave_framerate;
} else {
while ($chunk_id <> "data" && !feof($file))
{
$j = 1;
while ($j <= $chunk_size && !feof($file))
{
$null = fgetc ($file);
$j++;
}
$chunk_id = fgetc($file) . fgetc($file) . fgetc($file) . fgetc($file);
//print "<br>$chunk_id*";
$chunk_size = $this->longCalc (fgetc($file) , fgetc($file) , fgetc($file) , fgetc($file),0);
}
if ($chunk_id == "data")
{
$this->wave_length = (($chunk_size / $this->wave_channels) / ($this->wave_bits/8)) / $this->wave_framerate;
}

}
} else {
$valid = false;
}
} else {
if ($this->wave_id == "FORM" && $this->wave_type == "AIFF")
{
// we have a AIFF file here

$chunk_id = fgetc($file) . fgetc($file) . fgetc($file) . fgetc($file);
$chunk_size = $this->longCalc (fgetc($file) , fgetc($file) , fgetc($file) , fgetc($file),0);
if ($chunk_id == "COMM")
{
$format_len = $chunk_size;
$this->wave_channels = $this->shortCalc (fgetc ($file), fgetc ($file),1);
$null = $this->longCalc (fgetc ($file), fgetc ($file), fgetc ($file), fgetc ($file),1);
$this->wave_bits = $this->shortCalc (fgetc ($file), fgetc ($file),1);
$null = fgetc ($file) . fgetc ($file);
$this->wave_framerate = $this->shortCalc (fgetc ($file), fgetc ($file),1);

$read = 16;
} else {
$valid = false;
}
} else {
// probably crap

$valid = false;
}
}
}
fclose ($file);
} else {
$valid = false;
}
return ($valid);
}
}

function printSampleInfo(){
print "Битрейт: $this->wave_byterate <br>
Частота: $this->wave_framerate Гц<br>
Продолжительность: ".date("i:s", mktime(0,0,round($this->wave_length)))." мин<br>";
}

function loadFile ($loadFilename){
$this->wave_filename = $loadFilename;
$this->getSampleInfo();
}
}
?>