2012-10-02 140 views
1

我有以下脚本来读取mp3文件的id3标签。我手动检查过,id3标签有MP3文件,但我的输出总是返回几个文件: MP3 file does not have any ID3 tag!从ffmpeg转换的mp3文件中读取id3标签

我正在从ffmpeg转换这些文件。当我为原始文件运行下面的代码时,它会显示id3标记,但是当我运行转换文件的脚本(由ffmpeg)时,它不会显示任何id3标记。我已经下载了原始文件和转换后的文件,并检查了它们,发现两个文件都有完全相同的标签,但下面的代码总是给出错误信息。

下面是代码:

<?php 
$mp3 = "4.mp3"; //The mp3 file. 

$filesize = filesize($mp3); 
$file = fopen("4.mp3", "r"); 

fseek($file, -128, SEEK_END); // It reads the 

$tag = fread($file, 3); 

if($tag == "TAG") 
{ 
    $data["title"] = trim(fread($file, 30)); 

    $data["artist"] = trim(fread($file, 30)); 

    $data["album"] = trim(fread($file, 30)); 

    $data["year"] = trim(fread($file, 4)); 

     $data["genre"] = trim(fread($file, 1)); 



    } 
    else 
    die("MP3 file does not have any ID3 tag!"); 

    fclose($file); 

    while(list($key, $value) = each($data)) 
    { 
    print("$key: $value<br>\r\n");  
    } 
?>  
+0

你确定他们是ID3v1标签,而不是ID3v2标签吗? ID3v2是完全不同的。 – Brad

+0

@brad它们有时可能有时是1 2.在这种情况下它是2 – payal

+0

如果你想解析ID3v2,那么你需要编写一个ID3v2解析器! http://stackoverflow.com/questions/173257/writing-id3v2-tag-parsing-code-need-good-examples-to-test – Brad

回答

1

它需要正确的id3版本。我已经解决了这个代码的问题:

<? 

print_r(tagReader ("4.mp3")); 

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, 9+$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['Lenght'] = 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; 
} 

?> 
+0

顺便说一句,你的代码包含一个错字,它是'长度',而不是'长度'。 – nalply

+0

@nalply它的打字错误 – payal

0

有一个PECL扩展已经解决了ID3数据的解析。您可以在PHP手册中阅读它:http://www.php.net/manual/en/book.id3.php

+0

thx为您的答案,请你告诉我为什么我的输出是这样的。 Array([FileName] => 4.mp3 [TAG] => ID3 [Version] => 3.0 [Title] =>&Bahut Khubsurat Ghazal(mr-Jatt.Com)[专辑] => 1Loverz Choice(Khubsurat Ghazal)( www.mzc.in)[作者] => DJ Badboy(mr-Jatt.Com)[Track] =>(www.mzc.in))我蚂蚁整齐的输出存储在数据库中,请告诉我如何可以存储每个数据separetly在mysql – payal

+0

thx为您的答案可以请告诉我为什么我的输出合作,像这样。 Array([FileName] => 4.mp3 [TAG] => ID3 [Version] => 3.0 [Title] =>&Bahut Khubsurat Ghazal(mr-Jatt.Com)[专辑] => 1Loverz Choice(Khubsurat Ghazal)( www.mzc.in)[作者] => DJ Badboy(mr-Jatt.Com)[Track] =>(www.mzc.in))我蚂蚁整齐的输出存储在数据库中,请告诉我如何可以存储每个数据separetly在MySQL中 – payal