<?php
/*
//Merge two files
$path = 'path.mp3';
$path1 = 'path1.mp3';
$mp3 = new mp3($path);
$newpath = 'path.mp3';
$mp3->striptags();
$mp3_1 = new mp3($path1);
$mp3->mergeBehind($mp3_1);
$mp3->striptags();
$mp3->setIdv3_2('01','Track Title','Artist','Album','Year','Genre','Comments','Composer','OrigArtist',
'Copyright','url','encodedBy');
$mp3->save($newpath);
//Extract 30 seconds starting after 10 seconds.
$path = 'path.mp3';
$mp3 = new mp3($path);
$mp3_1 = $mp3->extract(10,30);
$mp3_1->save('newpath.mp3');
//Extract the exact length of time
$path = 'path.mp3';
$mp3 = new mp3($path);
$mp3->setFileInfoExact();
echo $mp3->time;
//note that this is the exact length!
*/
class mp3
{
var $str;
var $time;
var $frames;
function mp3($path="")
{
if($path!="")
{
}
}
function setStr($str)
{
$this->str = $str;
}
function setFileInfoExact()
{
$maxStrLen = strlen($this->str); $currentStrPos = strpos($this->str,chr(255)); $framesCount=0;
$time = 0;
while($currentStrPos < $maxStrLen)
{
$str = substr($this->str,$currentStrPos,4); for($i=0;$i < $strlen;$i++)
{
$parts[] = $this->decbinFill(ord($str[$i]),8); }
if($parts[0] != "11111111")
{
if(($maxStrLen-128) > $currentStrPos)
{
return false;
}
else
{
$this->frames = $framesCount;
return true;
}
}
$a = $this->doFrameStuff($parts);
$currentStrPos += $a[0];
$time += $a[1];
$framesCount++;
}
$this->frames = $framesCount;
return true;
}
{
$maxStrLen = strlen($this->str); $currentStrPos = strpos($this->str,chr(255)); $framesCount=0;
$time = 0;
$startCount = -1;
$endCount = -1;
while($currentStrPos < $maxStrLen)
{
if($startCount==-1&&$time>=$start)
{
$startCount = $currentStrPos;
}
if($endCount==-1&&$time>=($start+$length))
{
$endCount = $currentStrPos-$startCount;
}
$doFrame = true;
$str = substr($this->str,$currentStrPos,4); for($i=0;$i < $strlen;$i++)
{
$parts[] = $this->decbinFill(ord($str[$i]),8); }
if($parts[0] != "11111111")
{
if(($maxStrLen-128) > $currentStrPos)
{
$doFrame = false;
}
else
{
$doFrame = false;
}
}
if($doFrame)
{
$a = $this->doFrameStuff($parts);
$currentStrPos += $a[0];
$time += $a[1];
$framesCount++;
}
}
$mp3 = new mp3();
if($endCount == -1)
{
$endCount = $maxStrLen-$startCount;
}
if($startCount!=-1&&$endCount!=-1)
{
$mp3->setStr(substr($this->str,$startCount,$endCount)); }
return $mp3;
}
function decbinFill($dec,$length=0)
{
$nulls = $length-strlen($str); if($nulls>0)
{
for($i=0;$i<$nulls;$i++)
{
$str = '0'.$str;
}
}
return $str;
}
function doFrameStuff($parts)
{
//Get Audio Version
{
case '01':
$errors[]='Reserved audio version';
break;
case '00':
$audio = 2.5;
break;
case '10':
$audio = 2;
break;
case '11':
$audio = 1;
break;
}
//Get Layer
{
case '01':
$layer = 3;
break;
case '00':
$errors[]='Reserved layer';
break;
case '10':
$layer = 2;
break;
case '11':
$layer = 1;
break;
}
//Get Bitrate
$bitFlag = substr($parts[2],0,4); '0000' => array(free
, free
, free
, free
, free
), '0001' => array(32, 32, 32, 32, 8), '0010' => array(64, 48, 40, 48, 16), '0011' => array(96, 56, 48, 56, 24), '0100' => array(128, 64, 56, 64, 32), '0101' => array(160, 80, 64, 80, 40), '0110' => array(192, 96, 80, 96, 48), '0111' => array(224, 112, 96, 112, 56), '1000' => array(256, 128, 112, 128, 64), '1001' => array(288, 160, 128, 144, 80), '1010' => array(320, 192, 160, 160, 96), '1011' => array(352, 224, 192, 176, 112), '1100' => array(384, 256, 224, 192, 128), '1101' => array(416, 320, 256, 224, 144), '1110' => array(448, 384, 320, 256, 160), '1111' => array(bad
, bad
, bad
, bad
, bad
) );
$bitPart = $bitArray[$bitFlag];
$bitArrayNumber;
if($audio==1)
{
switch($layer)
{
case 1:
$bitArrayNumber=0;
break;
case 2:
$bitArrayNumber=1;
break;
case 3:
$bitArrayNumber=2;
break;
}
}
else
{
switch($layer)
{
case 1:
$bitArrayNumber=3;
break;
case 2:
$bitArrayNumber=4;
break;
case 3:
$bitArrayNumber=4;
break;
}
}
$bitRate = $bitPart[$bitArrayNumber];
//Get Frequency
'01'=>48000,
'10'=>32000,
'11'=>'reserved'),
$freq = $frequencies[$audio][substr($parts[2],4,2)]; //IsPadded?
$padding = substr($parts[2],6,1); if($layer==3||$layer==2)
{
//FrameLengthInBytes = 144 * BitRate / SampleRate + Padding
$frameLength = 144 * $bitRate * 1000 / $freq + $padding;
}
$frameLength = floor($frameLength); $seconds += $frameLength*8/($bitRate*1000);
return array($frameLength,$seconds); //Calculate next when next frame starts.
//Capture next frame.
}
function setIdv3_2($track,$title,$artist,$album,$year,$genre,$comments,$composer,$origArtist,
$copyright,$url,$encodedBy)
{
$urlLength = (int
)(strlen($url)+2); $copyrightLength = (int
)(strlen($copyright)+1); $origArtistLength = (int
)(strlen($origArtist)+1); $composerLength = (int
)(strlen($composer)+1); $commentsLength = (int
)strlen($comments)+5; $titleLength = (int
) strlen($title)+1; $artistLength = (int
)strlen($artist)+1; $albumLength = (int
) strlen($album)+1; $genreLength = (int
) strlen($genre)+1; $encodedByLength = (int
)(strlen($encodedBy)+1); $trackLength = (int
) strlen($track) + 1; $yearLength = (int
) strlen($year)+1; $str .= chr($trackLength);// $str .= $track;
$str .= chr($encodedByLength);// $str .= $encodedBy;
$str .= chr($urlLength);// $str .= $url;
$str .= chr($copyrightLength);// $str .= $copyright;
$str .= chr($origArtistLength);// $str .= $origArtist;
$str .= chr($composerLength);// $str .= $composer;
$str .= chr($commentsLength);// $str .= $comments;
$str .= chr($genreLength);// $str .= $genre;
$str .= chr($yearLength);// $str .= $year;
$str .= chr($albumLength);// $str .= $album;
$str .= chr($artistLength);// $str .= $artist;
$str .= chr($titleLength);// $str .= $title;
$this->str = $str.$this->str;
}
function mergeBehind(mp3 $mp3)
{
$this->str .= $mp3->str;
}
function mergeInfront(mp3 $mp3)
{
$this->str = $mp3->str.$this->str;
}
function getIdvEnd()
{
$str = substr($this->str,($strlen-128)); {
return $str;
}
else
{
return false;
}
}
function getStart()
{
for($i=0;$i<$strlen;$i++)
{
if($value == 255)
{
return $i;
}
}
}
function striptags()
{
//Remove start stuff...
$newStr = '';
$s = $start = $this->getStart();
if($s===false)
{
return false;
}
else
{
$this->str = substr($this->str,$start); }
//Remove end tag stuff
$end = $this->getIdvEnd();
if($end!==false)
{
}
}
function save($path)
{
}
//join various MP3s
function multiJoin($newpath,$array)
{
foreach ($array as $path)
{
$mp3 = new mp3($path);
$mp3->striptags();
$mp3_1 = new mp3($newpath);
$mp3->mergeBehind($mp3_1);
$mp3->save($newpath);
}
}
}
?>