1
它适用于本地文件,但不适用于外部域。这里是我的代码(这是我从http://www.barattalo.it/2010/02/22/reading-mp3-informations-with-php-id3-tags/了):filesize()stat无法获取MP3文件的ID3标签
<?
function tagReader($file){
$id3v23 = array("TIT2","TALB","TPE1","TRCK","TDRC","TLEN","USLT");
$id3v22 = array("TT2","TAL","TP1","TRK","TYE","TLE","ULT");
$fsize = filesize($file);
$fd = fopen($file,"r");
$tag = fread($fd,$fsize);
$tmp = "";
fclose($fd);
if (substr($tag,0,3) == "ID3") {
$result['FileName'] = $file;
$result['TAG'] = substr($tag,0,3);
$result['Version'] = hexdec(bin2hex(substr($tag,3,1))).".".hexdec(bin2hex(substr($tag,4,1)));
}
if($result['Version'] == "4.0" || $result['Version'] == "3.0"){
for ($i=0;$i<count($id3v23);$i++){
if (strpos($tag,$id3v23[$i].chr(0))!= FALSE){
$pos = strpos($tag, $id3v23[$i].chr(0));
$len = hexdec(bin2hex(substr($tag,($pos+5),3)));
$data = substr($tag, $pos, 10+$len);
for ($a=0;$a<strlen($data);$a++){
$char = substr($data,$a,1);
if($char >= " " && $char <= "~") $tmp.=$char;
}
if(substr($tmp,0,4) == "TIT2") $result['Title'] = substr($tmp,4);
if(substr($tmp,0,4) == "TALB") $result['Album'] = substr($tmp,4);
if(substr($tmp,0,4) == "TPE1") $result['Author'] = substr($tmp,4);
if(substr($tmp,0,4) == "TRCK") $result['Track'] = substr($tmp,4);
if(substr($tmp,0,4) == "TDRC") $result['Year'] = substr($tmp,4);
if(substr($tmp,0,4) == "TLEN") $result['Length'] = substr($tmp,4);
if(substr($tmp,0,4) == "USLT") $result['Lyric'] = substr($tmp,7);
$tmp = "";
}
}
}
if($result['Version'] == "2.0"){
for ($i=0;$i<count($id3v22);$i++){
if (strpos($tag,$id3v22[$i].chr(0))!= FALSE){
$pos = strpos($tag, $id3v22[$i].chr(0));
$len = hexdec(bin2hex(substr($tag,($pos+3),3)));
$data = substr($tag, $pos, 6+$len);
for ($a=0;$a<strlen($data);$a++){
$char = substr($data,$a,1);
if($char >= " " && $char <= "~") $tmp.=$char;
}
if(substr($tmp,0,3) == "TT2") $result['Title'] = substr($tmp,3);
if(substr($tmp,0,3) == "TAL") $result['Album'] = substr($tmp,3);
if(substr($tmp,0,3) == "TP1") $result['Author'] = substr($tmp,3);
if(substr($tmp,0,3) == "TRK") $result['Track'] = substr($tmp,3);
if(substr($tmp,0,3) == "TYE") $result['Year'] = substr($tmp,3);
if(substr($tmp,0,3) == "TLE") $result['Lenght'] = substr($tmp,3);
if(substr($tmp,0,3) == "ULT") $result['Lyric'] = substr($tmp,6);
$tmp = "";
}
}
}
return $result;
}
$song = tagReader("file.mp3");
echo $song[Title];
?>
感谢所有的帮助,我刚开始学习php的绳索... 我可以使用类似file_get_contents()而不是?或者还有另一种方式暂存本地文件?我知道我可以使用curl来wget,但是我无法在我的服务器上运行shell命令。 – robbiest 2011-04-18 23:22:42
或者只是下载文件的第一部分?我需要的所有信息都是正确的... – robbiest 2011-04-18 23:27:00
@robbiest,file_get_contents()可以帮助您获取远程文件,而不是在下载后使用此功能。关于ID3v2 ...是的,它在文件流的开头(ID3v1在最后),但你不知道标签数据的大小。 ID3v2并不像ID3v1那么简单,它可能包含超过这几个字段(120+)。有时它可能包含非常大量的数据,并且您想要的标签可能接近标签流的末尾。您应该更好地学习PHP,以及如何处理流内部,并且您可以在[官方id3v2文档](http://id3.org/id3v2.3.0)之后编写自己的ID3v2提取器。 – Wh1T3h4Ck5 2011-04-19 00:07:07