我正在开发一个从远程网址获取mp3详细信息的网站。我需要编写一个cron作业,以便获取所有歌曲信息,如文件名,路径,艺术家,流派,比特率,播放时间等,并将其放入数据库表中。
我尝试了getid3包,但是一次获取多个url时速度非常慢,并且我得到了最大的执行错误。
示例:
require_once('getid/getid3/getid3.php');
$urls = array ('http://stackoverflow.com/test1.mp3','http://stackoverflow.com/test2.mp3''http://stackoverflow.com/test3.mp3');
foreach($urls as $ur){
$mp3_det = getMp3Info( $ur );
print_r ($mp3_det);
}
function getMp3Info ( $url ){
if($url){
/**********/
$filename = tempnam('/tmp','getid3');
if (file_put_contents($filename, file_get_contents($url, false, null, 0, 35000))) {
if (require_once('getid/getid3/getid3.php')) {
$getID3 = new getID3;
$ThisFileInfo = $getID3->analyze($filename);
unlink($filename);
$bitratez = $ThisFileInfo[audio][bitrate] ? $ThisFileInfo[audio][bitrate] : '';
$headers = get_headers($url, 1);
if ((!array_key_exists("Content-Length", $headers))) { return false; }
// print $headers["Content-Length"];
$filesize= round($headers["Content-Length"]/1000);
$contentLengthKBITS=$filesize*8;
if ( $bitratez ){
$bitrate= round ( $bitratez/1000 );
$seconds=$contentLengthKBITS/$bitrate;
$playtime_mins = floor($seconds/60);
$playtime_secs = $seconds % 60;
if(strlen($playtime_secs)=='1'){$zero='0';}
$playtime_secs = $zero.$playtime_secs;
$playtime_string=$playtime_mins.':'.$playtime_secs;
}
else $playtime_string='0:00';
// echo '<pre>'.print_r($ThisFileInfo, true).'</pre>';
}
$bitrate = $bitrate ? $bitrate : 0;
$ret = array();
$ret['playtime'] = $playtime_string;
$ret['filesize'] = $filesize;
$ret['bitrate'] = $bitrate;
return $ret;
}
}
答案 0 :(得分:1)
您可以通过使用套接字连接并一次读取文件块来帮助执行时间,并不断尝试分析文件。
由于ID3数据存储在mp3的开头,因此下载整个内容是没有意义的。我现在看到的最大问题是analyze函数只接受文件名,而不是二进制数据(这就是你所拥有的)。因此,您必须更新代码,或者使用类似的函数进行分析,以便与二进制数据一起使用。
答案 1 :(得分:0)
MP3文件附带某种元数据,几乎与其他二进制文件格式相同。它们位于ID标签中。 ID标签有很多版本,比如ID3或ID4标签。现在,通过PHP,可以轻松提取随MP3文件提供的IDv3标签信息。
您需要从sourceforge下载PHP中的某些库,例如getID3。这样,您可以从mp3文件中提取艺术家姓名,流派,持续时间,长度,大小等信息。 IDv4包含其他信息,例如专辑封面。