PHP:获取远程.mp3文件的元数据

时间:2014-09-24 18:55:51

标签: php mp3 metadata

我正在寻找一个从URL获取.mp3文件元数据的函数(不是我服务器上的本地.mp3文件)。
另外,我不想安装http://php.net/manual/en/id3.installation.php或与我的服务器类似的东西 我正在寻找一个独立的功能。

现在我正在使用此功能:

<?php
function getfileinfo($remoteFile) 
{ 
    $url=$remoteFile;
    $uuid=uniqid("designaeon_", true);
    $file="../temp/".$uuid.".mp3";
    $size=0;
    $ch = curl_init($remoteFile);
    //==============================Get Size==========================//
    $contentLength = 'unknown';
    $ch1 = curl_init($remoteFile);
    curl_setopt($ch1, CURLOPT_NOBODY, true);
    curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch1, CURLOPT_HEADER, true);
    curl_setopt($ch1, CURLOPT_FOLLOWLOCATION, true); //not necessary unless the file redirects (like the PHP example we're using here)
    $data = curl_exec($ch1);
    curl_close($ch1);
    if (preg_match('/Content-Length: (\d+)/', $data, $matches)) {
    $contentLength = (int)$matches[1];
    $size=$contentLength;
    }
    //==============================Get Size==========================//                 
    if (!$fp = fopen($file, "wb")) {
    echo 'Error opening temp file for binary writing';
    return false;
    } else if (!$urlp = fopen($url, "r")) {
    echo 'Error opening URL for reading';
    return false;
    }
    try {
    $to_get = 65536; // 64 KB
    $chunk_size = 4096; // Haven't bothered to tune this, maybe other values would work better??
    $got = 0; $data = null;

    // Grab the first 64 KB of the file
    while(!feof($urlp) && $got < $to_get) {  $data = $data . fgets($urlp, $chunk_size);  $got += $chunk_size;  }  fwrite($fp, $data);  // Grab the last 64 KB of the file, if we know how big it is.  if ($size > 0) {
    curl_setopt($ch, CURLOPT_FILE, $fp);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_RESUME_FROM, $size - $to_get);
    curl_exec($ch);

    // Now $fp should be the first and last 64KB of the file!!               
    @fclose($fp);
    @fclose($urlp);
    } catch (Exception $e) {
    @fclose($fp);
    @fclose($urlp);
    echo 'Error transfering file using fopen and cURL !!';
    return false;
    }
    $getID3 = new getID3;
    $filename=$file;
    $ThisFileInfo = $getID3->analyze($filename);
    getid3_lib::CopyTagsToComments($ThisFileInfo);
    unlink($file);
    return $ThisFileInfo;
}
?>

此函数从.mp3文件的URL下载64KB,然后使用getID3函数(适用于local .mp3 files only)返回包含元数据的数组,然后删除先前下载的64KB。 这个函数的问题在于它的性质太慢了(每个.mp3下载64KB,想象1000个mp3文件。)

要明确我的问题:我需要一个快速的独立函数来读取远程URL .mp3文件的元数据。

1 个答案:

答案 0 :(得分:1)

  

此函数从.mp3文件的URL下载64KB,然后使用getID3函数(仅适用于本地.mp3文件)返回包含元数据的数组,然后删除先前下载的64KB。这个功能的问题在于它的性质太慢了(下载64KB&每个.mp3,想象1000个mp3文件。)

是的,你有什么建议?如果您没有获取数据,您如何获得数据?没有办法让通用远程HTTP服务器向您发送ID3数据。真的,没有魔力。想一想。

您现在正在做的事情已经非常可靠了,除了它不能处理所有版本的ID3并且不能使用超过64KB ID3标签的文件。我要做的就是使用multi-cURL。

有几个PHP类可以使这更容易:

https://github.com/jmathai/php-multi-curl

$mc = EpiCurl::getInstance();
$results[] = $mc->addUrl(/* Your stream URL here /*); // Run this in a loop, 10 at a time or so

foreach ($results as $result) {
    // Do something with the data.
}