使用PHP读取远程mp3文件信息

3

我正在开发一个网站,该网站将从远程URL获取MP3详细信息。我需要编写一个定时任务,以便获取所有歌曲信息,例如文件名、路径、艺术家、流派、比特率、播放时间等,并将其放入数据库表中。

我尝试使用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;
            }
        }

你的问题是什么?我假设你已经知道了max_execution_time参数吗?我认为改变它或将整个任务分成多个作业是唯一的解决方法。 - Pekka
2个回答

1
你可以尝试使用套接字连接,并按块读取文件,不断尝试分析文件来帮助减少执行时间。
由于ID3数据存储在mp3的开头,所以下载整个文件是没有意义的。目前我看到的最大问题是analyze函数只接受文件名,而不是二进制数据(这是你将拥有的)。因此,你要么需要更新代码,要么创建一个类似的函数来分析你的二进制数据。

0

MP3文件带有某种元数据,几乎与其他二进制文件格式相同。它们位于ID标签中。有许多版本的ID标签,例如ID3或ID4标签。现在,有一种简单的方法可以通过PHP从随MP3文件提供的IDv3标签信息中提取信息。

您需要从sourceforge下载一些PHP库,例如getID3。这样,您就可以从mp3文件中提取艺术家姓名、流派、持续时间、长度、大小等信息。IDv4包含其他信息,如专辑封面。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接