PDA

View Full Version : سوال: به دست آوردن مدت زمان یک فایل Mp3



MoMo121
یک شنبه 17 شهریور 1392, 16:48 عصر
با سلام خدمت تمام دوستان

می خواستم مدت زمان فایل MP3 را با استفاده از PHP به دست بیارم

البته با سرچ در گوگل یه کلاس پیدا شد که همه چیز رو می گه ولی من می خوام فقط و فقط مدت رو به دست بیارم

لطفا کمک کنید با تشکر

Unique
یک شنبه 17 شهریور 1392, 22:35 عصر
نمیدونم چه کلاسی را میگین ولی از getid3 (http://sourceforge.net/projects/getid3/) برای این کار استفاده کردم و جواب میده.

SilverLearn
یک شنبه 17 شهریور 1392, 22:44 عصر
لینک زیر رو ببین به همراه مثال آموزش داده :

http://www.zedwood.com/article/127/php-calculate-duration-of-mp3

MoMo121
دوشنبه 18 شهریور 1392, 12:28 عصر
نمیدونم چه کلاسی را میگین ولی از getid3 (http://sourceforge.net/projects/getid3/) برای این کار استفاده کردم و جواب میده.



لینک زیر رو ببین به همراه مثال آموزش داده :

http://www.zedwood.com/article/127/php-calculate-duration-of-mp3

خیلی ممنون ولی این ها تمام اطلاعات یک فایل MP3 را ارائه می کنند

من می خوام فقط مدت فایل Mp3 مشخص شود

SilverLearn
دوشنبه 18 شهریور 1392, 15:51 عصر
:افسرده::افسرده::افسرده:

دوست عزیز یه برنامه نویس باید به کدی که بهش میدن کاملا نگاه کنه و دقت کنه ببینه چیکار می کنه :عصبانی++:

کدی که در سایتی که در بالا معرفی کردم درسته که خیلی کامله ولی شما می تونی ازش استفاده کنی و مقداری که میخوای خودت رو نمایش بدی (مدت زمان فایل)

ایندفعه برات یه مثال میزنم ولی دفعات بعد کمی روی کدها تامل کنید و خودتون با توجه به نیازتون تغییرش بدین

اول یک فایل به نام class.php ساخته و کد زیر رو داخلش بریزید :



<?php
/*
php5 class (will not work in php4)
for detecting bitrate and duration of regular mp3 files (not VBR files)
*/

//-----------------------------------------------------------------------------
class mp3file
{
protected $block;
protected $blockpos;
protected $blockmax;
protected $blocksize;
protected $fd;
protected $bitpos;
protected $mp3data;
public function __construct($filename)
{
$this->powarr = array(0=>1,1=>2,2=>4,3=>8,4=>16,5=>32,6=>64,7=>128);
$this->blockmax= 1024;

$this->mp3data = array();
$this->mp3data['Filesize'] = filesize($filename);

$this->fd = fopen($filename,'rb');
$this->prefetchblock();
$this->readmp3frame();
}
public function __destruct()
{
fclose($this->fd);
}
//-------------------
public function get_metadata()
{
return $this->mp3data;
}
protected function readmp3frame()
{
$iscbrmp3=true;
if ($this->startswithid3())
$this->skipid3tag();
else if ($this->containsvbrxing())
{
$this->mp3data['Encoding'] = 'VBR';
$iscbrmp3=false;
}
else if ($this->startswithpk())
{
$this->mp3data['Encoding'] = 'Unknown';
$iscbrmp3=false;
}

if ($iscbrmp3)
{
$i = 0;
$max=5000;
//look in 5000 bytes...
//the largest framesize is 4609bytes(256kbps@8000Hz mp3)
for($i=0; $i<$max; $i++)
{
//looking for 1111 1111 111 (frame synchronization bits)
if ($this->getnextbyte()==0xFF)
if ($this->getnextbit() && $this->getnextbit() && $this->getnextbit())
break;
}
if ($i==$max)
$iscbrmp3=false;
}

if ($iscbrmp3)
{
$this->mp3data['Encoding' ] = 'CBR';
$this->mp3data['MPEG version' ] = $this->getnextbits(2);
$this->mp3data['Layer Description'] = $this->getnextbits(2);
$this->mp3data['Protection Bit' ] = $this->getnextbits(1);
$this->mp3data['Bitrate Index' ] = $this->getnextbits(4);
$this->mp3data['Sampling Freq Idx'] = $this->getnextbits(2);
$this->mp3data['Padding Bit' ] = $this->getnextbits(1);
$this->mp3data['Private Bit' ] = $this->getnextbits(1);
$this->mp3data['Channel Mode' ] = $this->getnextbits(2);
$this->mp3data['Mode Extension' ] = $this->getnextbits(2);
$this->mp3data['Copyright' ] = $this->getnextbits(1);
$this->mp3data['Original Media' ] = $this->getnextbits(1);
$this->mp3data['Emphasis' ] = $this->getnextbits(1);
$this->mp3data['Bitrate' ] = mp3file::bitratelookup($this->mp3data);
$this->mp3data['Sampling Rate' ] = mp3file::samplelookup($this->mp3data);
$this->mp3data['Frame Size' ] = mp3file::getframesize($this->mp3data);
$this->mp3data['Length' ] = mp3file::getduration($this->mp3data,$this->tell2());
$this->mp3data['Length mm:ss' ] = mp3file::seconds_to_mmss($this->mp3data['Length']);

if ($this->mp3data['Bitrate' ]=='bad' ||
$this->mp3data['Bitrate' ]=='free' ||
$this->mp3data['Sampling Rate']=='unknown' ||
$this->mp3data['Frame Size' ]=='unknown' ||
$this->mp3data['Length' ]=='unknown')
$this->mp3data = array('Filesize'=>$this->mp3data['Filesize'], 'Encoding'=>'Unknown');
}
else
{
if(!isset($this->mp3data['Encoding']))
$this->mp3data['Encoding'] = 'Unknown';
}
}
protected function tell()
{
return ftell($this->fd);
}
protected function tell2()
{
return ftell($this->fd)-$this->blockmax +$this->blockpos-1;
}
protected function startswithid3()
{
return ($this->block[1]==73 && //I
$this->block[2]==68 && //D
$this->block[3]==51); //3
}
protected function startswithpk()
{
return ($this->block[1]==80 && //P
$this->block[2]==75); //K
}
protected function containsvbrxing()
{
//echo "<!--".$this->block[37]." ".$this->block[38]."-->";
//echo "<!--".$this->block[39]." ".$this->block[40]."-->";
return(
($this->block[37]==88 && //X 0x58
$this->block[38]==105 && //i 0x69
$this->block[39]==110 && //n 0x6E
$this->block[40]==103) //g 0x67
/* ||
($this->block[21]==88 && //X 0x58
$this->block[22]==105 && //i 0x69
$this->block[23]==110 && //n 0x6E
$this->block[24]==103) //g 0x67*/
);

}
protected function debugbytes()
{
for($j=0; $j<10; $j++)
{
for($i=0; $i<8; $i++)
{
if ($i==4) echo " ";
echo $this->getnextbit();
}
echo "<BR>";
}
}
protected function prefetchblock()
{
$block = fread($this->fd, $this->blockmax);
$this->blocksize = strlen($block);
$this->block = unpack("C*", $block);
$this->blockpos=0;
}
protected function skipid3tag()
{
$bits=$this->getnextbits(24);//ID3
$bits.=$this->getnextbits(24);//v.v flags

//3 bytes 1 version byte 2 byte flags
$arr = array();
$arr['ID3v2 Major version'] = bindec(substr($bits,24,8));
$arr['ID3v2 Minor version'] = bindec(substr($bits,32,8));
$arr['ID3v2 flags' ] = bindec(substr($bits,40,8));
if (substr($bits,40,1)) $arr['Unsynchronisation']=true;
if (substr($bits,41,1)) $arr['Extended header']=true;
if (substr($bits,42,1)) $arr['Experimental indicator']=true;
if (substr($bits,43,1)) $arr['Footer present']=true;

$size = "";
for($i=0; $i<4; $i++)
{
$this->getnextbit();//skip this bit, should be 0
$size.= $this->getnextbits(7);
}

$arr['ID3v2 Tags Size']=bindec($size);//now the size is in bytes;
if ($arr['ID3v2 Tags Size'] - $this->blockmax>0)
{
fseek($this->fd, $arr['ID3v2 Tags Size']+10 );
$this->prefetchblock();
if (isset($arr['Footer present']) && $arr['Footer present'])
{
for($i=0; $i<10; $i++)
$this->getnextbyte();//10 footer bytes
}
}
else
{
for($i=0; $i<$arr['ID3v2 Tags Size']; $i++)
$this->getnextbyte();
}
}

protected function getnextbit()
{
if ($this->bitpos==8)
return false;

$b=0;
$whichbit = 7-$this->bitpos;
$mult = $this->powarr[$whichbit]; //$mult = pow(2,7-$this->pos);
$b = $this->block[$this->blockpos+1] & $mult;
$b = $b >> $whichbit;
$this->bitpos++;

if ($this->bitpos==8)
{
$this->blockpos++;

if ($this->blockpos==$this->blockmax) //end of block reached
{
$this->prefetchblock();
}
else if ($this->blockpos==$this->blocksize)
{//end of short block reached (shorter than blockmax)
return;//eof
}

$this->bitpos=0;
}
return $b;
}
protected function getnextbits($n=1)
{
$b="";
for($i=0; $i<$n; $i++)
$b.=$this->getnextbit();
return $b;
}
protected function getnextbyte()
{
if ($this->blockpos>=$this->blocksize)
return;

$this->bitpos=0;
$b=$this->block[$this->blockpos+1];
$this->blockpos++;
return $b;
}
//-----------------------------------------------------------------------------
public static function is_layer1(&$mp3) { return ($mp3['Layer Description']=='11'); }
public static function is_layer2(&$mp3) { return ($mp3['Layer Description']=='10'); }
public static function is_layer3(&$mp3) { return ($mp3['Layer Description']=='01'); }
public static function is_mpeg10(&$mp3) { return ($mp3['MPEG version']=='11'); }
public static function is_mpeg20(&$mp3) { return ($mp3['MPEG version']=='10'); }
public static function is_mpeg25(&$mp3) { return ($mp3['MPEG version']=='00'); }
public static function is_mpeg20or25(&$mp3) { return ($mp3['MPEG version']{1}=='0'); }
//-----------------------------------------------------------------------------
public static function bitratelookup(&$mp3)
{
//bits V1,L1 V1,L2 V1,L3 V2,L1 V2,L2&L3
$array = array();
$array['0000']=array('free','free','free','free','free');
$array['0001']=array( '32', '32', '32', '32', '8');
$array['0010']=array( '64', '48', '40', '48', '16');
$array['0011']=array( '96', '56', '48', '56', '24');
$array['0100']=array( '128', '64', '56', '64', '32');
$array['0101']=array( '160', '80', '64', '80', '40');
$array['0110']=array( '192', '96', '80', '96', '48');
$array['0111']=array( '224', '112', '96', '112', '56');
$array['1000']=array( '256', '128', '112', '128', '64');
$array['1001']=array( '288', '160', '128', '144', '80');
$array['1010']=array( '320', '192', '160', '160', '96');
$array['1011']=array( '352', '224', '192', '176', '112');
$array['1100']=array( '384', '256', '224', '192', '128');
$array['1101']=array( '416', '320', '256', '224', '144');
$array['1110']=array( '448', '384', '320', '256', '160');
$array['1111']=array( 'bad', 'bad', 'bad', 'bad', 'bad');

$whichcolumn=-1;
if (mp3file::is_mpeg10($mp3) && mp3file::is_layer1($mp3) )//V1,L1
$whichcolumn=0;
else if (mp3file::is_mpeg10($mp3) && mp3file::is_layer2($mp3) )//V1,L2
$whichcolumn=1;
else if (mp3file::is_mpeg10($mp3) && mp3file::is_layer3($mp3) )//V1,L3
$whichcolumn=2;
else if (mp3file::is_mpeg20or25($mp3) && mp3file::is_layer1($mp3) )//V2,L1
$whichcolumn=3;
else if (mp3file::is_mpeg20or25($mp3) && (mp3file::is_layer2($mp3) || mp3file::is_layer3($mp3)) )
$whichcolumn=4;//V2, L2||L3

if (isset($array[$mp3['Bitrate Index']][$whichcolumn]))
return $array[$mp3['Bitrate Index']][$whichcolumn];
else
return "bad";
}
//-----------------------------------------------------------------------------
public static function samplelookup(&$mp3)
{
//bits MPEG1 MPEG2 MPEG2.5
$array = array();
$array['00'] =array('44100','22050','11025');
$array['01'] =array('48000','24000','12000');
$array['10'] =array('32000','16000','8000');
$array['11'] =array('res','res','res');

$whichcolumn=-1;
if (mp3file::is_mpeg10($mp3))
$whichcolumn=0;
else if (mp3file::is_mpeg20($mp3))
$whichcolumn=1;
else if (mp3file::is_mpeg25($mp3))
$whichcolumn=2;

if (isset($array[$mp3['Sampling Freq Idx']][$whichcolumn]))
return $array[$mp3['Sampling Freq Idx']][$whichcolumn];
else
return 'unknown';
}
//-----------------------------------------------------------------------------
public static function getframesize(&$mp3)
{
if ($mp3['Sampling Rate']>0)
{
return ceil((144 * $mp3['Bitrate']*1000)/$mp3['Sampling Rate']) + $mp3['Padding Bit'];
}
return 'unknown';
}
//-----------------------------------------------------------------------------
public static function getduration(&$mp3,$startat)
{
if ($mp3['Bitrate']>0)
{
$KBps = ($mp3['Bitrate']*1000)/8;
$datasize = ($mp3['Filesize'] - ($startat/8));
$length = $datasize / $KBps;
return sprintf("%d", $length);
}
return "unknown";
}
//-----------------------------------------------------------------------------
public static function seconds_to_mmss($duration)
{
return sprintf("%d:%02d", ($duration /60), $duration %60 );
}
}
?>

البته می تونی کد هایی که بهش نیاز نداری رو پاک کنی....

حالا در جایی که می خوای مدت زمان رو به نمایش بگذاری کد زیر رو قرار بده
در زیر من در فایل index.php فایل class.php رو اینکلود کردم تا از تابع اون استفاده کنم ....



<?php
include ('class.php');
$f = 'rezasadeghi.mp3';
$m = new mp3file($f);
$a = $m->get_metadata();

if ($a['Encoding']=='Unknown')
echo "?";
else if ($a['Encoding']=='VBR'){


foreach($a as $key => $value){
if($key =='Length mm:ss')
echo "{$key} => {$value}\n " . "</br>";
}
}
else if ($a['Encoding']=='CBR')
{

foreach($a as $key => $value){
if($key =='Length mm:ss')
echo "{$key} => {$value}\n " . "</br>";

}
}

unset($a);

?>

MoMo121
دوشنبه 18 شهریور 1392, 17:34 عصر
:افسرده::افسرده::افسرده:

دوست عزیز یه برنامه نویس باید به کدی که بهش میدن کاملا نگاه کنه و دقت کنه ببینه چیکار می کنه :عصبانی++:

کدی که در سایتی که در بالا معرفی کردم درسته که خیلی کامله ولی شما می تونی ازش استفاده کنی و مقداری که میخوای خودت رو نمایش بدی (مدت زمان فایل)

ایندفعه برات یه مثال میزنم ولی دفعات بعد کمی روی کدها تامل کنید و خودتون با توجه به نیازتون تغییرش بدین


آقای djmohammad من یه چند هفته ای هست دارم از همین کلاسی که شما آدرسش رو گذاشتی استفاده می کنم که در همون پست اول اگه نگاه کنید بهش اشاره کردم

البته با سرچ در گوگل یه کلاس پیدا شد که همه چیز رو می گه ولی من می خوام فقط و فقط مدت رو به دست بیارم

ولی دو تا مشکل داره یکی این که من فقط می خوام زمان را ارائه کنه دوم اینکه گاهی اوقات مدت زمان را 31 ثانیه بیشتر نشون می ده




ایندفعه برات یه مثال میزنم ولی دفعات بعد کمی روی کدها تامل کنید و خودتون با توجه به نیازتون تغییرش بدین
این مثال که شما زدی همون که تو سایت زده فقط شما به جای استفاده از آرایه برداشتی از foreach استفاده کردی دست درد نکنه ولی حالا چرا برای این کار انقدر منت می ذاری
دیگه استفاده از آرایه تامل داره:عصبانی++::عصبانی++::عصبا ی++::عصبانی++::عصبانی++::عصبان ++::عصبانی++::عصبانی++::عصبانی+ +::عصبانی++::عصبانی++::عصبانی++: :عصبانی++::عصبانی++:

SilverLearn
دوشنبه 18 شهریور 1392, 18:03 عصر
این مثال که شما زدی همون که تو سایت زده فقط شما به جای استفاده از آرایه برداشتی از foreach استفاده کردی دست درد نکنه ولی حالا چرا برای این کار انقدر منت می ذاری

مگه من گفتم خودم مثال زدم از اول بخونین ببینین گفتم :


کدی که در سایتی که در بالا معرفی کردم درسته که خیلی کامله ولی شما می تونی ازش استفاده کنی و مقداری که میخوای خودت رو نمایش بدی (مدت زمان فایل)


منتی نیست فقط شما رو دعوت کردم به فکر روی کدها....



ولی دو تا مشکل داره یکی این که من فقط می خوام زمان را ارائه کنه دوم اینکه گاهی اوقات مدت زمان را 31 ثانیه بیشتر نشون می ده


عزیزم دوباره داری حرف خودت رو میزنی یا من متوجه نمیشم یا اینکه.....
خوب کدی که براتون قرار دادم میاد و فقط مدت زمان رو نشون میده :)
در مورد بیشتر نشون دادن هم من الان امتحان کردم و شما درست میگی دقیق نیست و برای من 10 ثانیه بیشتر نشون داد....

MoMo121
دوشنبه 18 شهریور 1392, 20:36 عصر
خب حالا اصلا این حرف ها مهم نیست چی کار کنیم این رو درست نشون بده ؟

SilverLearn
دوشنبه 18 شهریور 1392, 20:48 عصر
معلومه که مهم نیست :)
من وقتی امتحان کردم 10 ثانیه بیشتر نشون میداد خوب یکی از راهاش میشه این باشه که 10 ثانیه از نتیجه کل کم کنی و اون رو نمایش بدی :)

SilverLearn
دوشنبه 18 شهریور 1392, 20:51 عصر
راستی یه راه دیگه هم استفاده از shell_exec هست که در بیشتر هاست های اشتراکی بسته هست و قابل استفاده نیست...

AliRezaPro
دوشنبه 18 شهریور 1392, 21:19 عصر
به نوشته هی دوستان بیشتر دقت کنید
این کلاس را دانلود کنید :

http://sourceforge.net/projects/getid3/files/getID3%28%29%201.x/1.9.7/

از این کد استفاده کنید :


require_once('getid3/getid3.php');

$getID3 = new getID3;

$path = '1.mp3';
$mixinfo = $getID3->analyze( $path );

// Optional: copies data from all subarrays of [tags] into [comments] so
// metadata is all available in one location for all tag formats
// metainformation is always available under [tags] even if this is not called
getid3_lib::CopyTagsToComments($mixinfo);

// Output desired information in whatever format you want
// Note: all entries in [comments] or [tags] are arrays of strings
// See structure.txt for information on what information is available where
// or check out the output of /demos/demo.browse.php for a particular file
// to see the full detail of what information is returned where in the array
//echo @$ThisFileInfo['comments_html']['artist'][0]; // artist from any/all available tag formats
//echo @$ThisFileInfo['tags']['id3v2']['title'][0]; // title from ID3v2
$bit_rate = $mixinfo['audio']['bitrate']; // audio bitrate
$play_time = $mixinfo['playtime_string']; // playtime in minutes:seconds, formatted string

//print_r($mixinfo);

list($mins , $secs) = explode(':' , $play_time);

if($mins > 60)
{
$hours = intval($mins / 60);
$mins = $mins - $hours*60;
}

$play_time = sprintf("%02d:%02d:%02d" , $hours , $mins , $secs);

echo $play_time;
کاملا صحیح playtime را میدهد

Unique
سه شنبه 19 شهریور 1392, 01:23 صبح
خیلی ممنون ولی این ها تمام اطلاعات یک فایل MP3 را ارائه می کنند
من می خوام فقط مدت فایل Mp3 مشخص شود

واقعا حیفه در مورد این موضوعات پست زدن اما برای من حرف شما خیلی عجیبه ! مثل اینه بگیم من یک کلاس (یا کد ! فرقی نمیکنه و مغلطه هستش) برای zip کردن میخوام ااما اگه اون کلاس یا کد unzip هم میکرد دیگه به درد من نمیخوره ! دوست عزیز گرامی وقتی کلاس قدرتمندی مثل getid3 وجود داره و معرفی میشه یا خودتون جستجو میکنید چه دلیلی داره گیر بدین این کلاس ۱۰۰ تا کار بیشتر از کاری که من میخوام انجام میده !؟

نکنه نگران این هستین که چند کیلو یا مگ بیشتر روی هاست اشغال بشه ؟ یا نگرانید از cpu و رم اشتراکی شما بیشتر استفاده بشه !؟ میدونی این سرور های اشتراکی چه غول هایی برای خودشون هستند ؟ نگران چی هستین ؟


ولی من می خوام فقط و فقط مدت رو به دست بیارم
میشه معنی کنید این جمله را برای من ؟ شاید من درک نمیکنم و شما چیزی میدونی که من نمیدونم ! لطف کن بیا به من یاد بده لطفا ، من یک عمر ازت ممنون میشم به خدا.

باز هم عذر میخوام پست نا مربوط زدم !