2016-10-21 11 views
0

ストリームからアイスキャストメタデータを抽出しようとしています。 私はいくつかのストリームで動作し、他のストリームでは動作しないコードを持っています。 問題は、一部のストリームでicymetaint値が返されず、コードが失われてしまうことです。一部のアイスキャストストリームからメタデータを抽出できません。

私はこのストリームからicymetaintヘッダを取得することはできません。 http://radio.hbr1.com:19800/tronic.ogg

をしかし、私はVLCメディアプレーヤーに入れたときに、それはメタがうまく表示されます。 ここで私は正確に何が欠けていますか?アイデアストリームがメタデータを送信するためのその他の方法はありますか?あなたが唯一のShoutcastは中Nullsoftのことで導入さ脳死古代のメタデータのスリップストリームを解析しようとしているためだ

public function GetDataFromStream($parsedUrl) 
{ 
    $returnData = array(); 
    $addr = $parsedUrl['host']; 

    $addr = gethostbyname($addr); 

    $sock = fsockopen($addr, $parsedUrl['port'], $errno, $errstr, 5); 
    $path = isset($parsedUrl['path'])?$parsedUrl['path']:'/'; 

    if ($sock) 
    { 
     $request = 'GET '. $path .' HTTP/1.0' . CRLF . 
      'Host: ' . $parsedUrl['host'] . CRLF . 
      'Connection: Close' . CRLF . 
      'User-Agent: ' . $this->useragent . CRLF . 
      'Accept: */*' . CRLF . 
      'icy-metadata: 1'.CRLF. 
      'icy-prebuffer: 65536'.CRLF. 
      (isset($parsedUrl['user']) ? 'Authorization: Basic ' . 
      base64_encode($parsedUrl['user'] . ':' . $parsedUrl['pass']) . CRLF : ''). 
      'X-TipOfTheDay: Winamp "Classic" rulez all of them.' . CRLF . CRLF; 

     if (fwrite($sock, $request)) 
     { 
      $theaders = $line = ''; 

      while (!feof($sock)) 
      { 
       $line = fgets($sock, 4096); 

       if('' == trim($line)) 
        break; 
       $theaders .= $line; 
      } 

      $theaders = explode(CRLF, $theaders); 

      foreach ($theaders as $header) 
      { 
       $t = explode(':', $header); 


       if (isset($t[0]) && trim($t[0]) != '') 
       { 
        $name = preg_replace('/[^a-z][^a-z0-9]*/i','', strtolower(trim($t[0]))); 
        array_shift($t); 
        $value = trim(implode(':', $t)); 

        if ($value != '') 
        { 
         if (is_numeric($value)) 
          $this->headers[$name] = (int)$value; 
         else 
          $this->headers[$name] = $value; 
        } 
       } 
      } 

      if (isset($this->headers['icymetaint'])) 
      { 
       $metainterval = $this->headers['icymetaint']; 
       $intervals = 0; 
       $metadata = ''; 

       while(1) 
       { 
        $data = ''; 

        while(!feof($sock)) 
        { 
         $data .= fgetc($sock); 

         if (strlen($data) >= $metainterval) 
          break; 
        } 

        $len = join(unpack('c', fgetc($sock))) * 16; 

        if ($len > 0) 
        { 
         $metadata = str_replace("\0", '', fread($sock, $len)); 
         break; 
        } 
        else 
        { 
         $intervals++; 
         if ($intervals > 100) break; 
        } 
       } 

       $metarr = explode(';', $metadata); 

       foreach ($metarr as $meta) 
       { 
        $t = explode('=', $meta); 

        if (isset($t[0]) && trim($t[0]) != '') 
        { 
         $name = preg_replace('/[^a-z][^a-z0-9]*/i','', strtolower(trim($t[0]))); 

         array_shift($t); 

         $value = trim(implode('=', $t)); 

         if (substr($value, 0, 1) == '"' || substr($value, 0, 1) == "'") 
          $value = substr($value, 1); 

         if (substr($value, -1) == '"' || substr($value, -1) == "'") 
          $value = substr($value, 0, -1); 

         if ($value != '') 
         { 
          $tmp = &$this->metadata; 
          $tmp[$name] = $value; 
         } 
        } 
       } 
       $this->valid = true; 
      } 
      else 
      { 
       $this->valid = false; 
      } 

      fclose($sock); 
     } 
     else 
      echo 'unable to write.'; 
    } 
    else 
     //echo 'no socket '.$errno.' - '.$errstr.'.'; 
     ; 

} 

答えて

2

あなたは、.xspfマウントポイントの拡張機能を使用してXMLを取得し、それを解析することができます

<?php 
$stream_url = "http://radio.hbr1.com:19800/tronic.ogg"; 
$xspf_url = $stream_url . ".xspf"; 
$xml = file_get_contents($xspf_url); 
if($xml){ 
    $data = simplexml_load_string($xml); 
    // Track artist 
    print $data->trackList->track->creator; 
    // Track title 
    print $data->trackList->track->title; 
} 
?> 

ここで(私はURLの内容を読み取るためにlynxを使用)のような.xspfデータがどのように見えるかです:

$ lynx -mime_header http://radio.hbr1.com:19800/tronic.ogg.xspf 
HTTP/1.0 200 OK 
Content-Type: application/xspf+xml 
Content-Length: 615 

<?xml version="1.0" encoding="UTF-8"?> 
<playlist xmlns="http://xspf.org/ns/0/" version="1"> 
    <title/> 
    <creator/> 
    <trackList> 
    <track> 
     <location>http://radio.hbr1.com:19800/tronic.ogg</location> 
     <creator>Res Q</creator> 
     <title>Fakesleep (2012)</title> 
     <annotation>Stream Title: HBR1 - Tronic Lounge 
Stream Description: Music on Futurenet 
Content Type:application/ogg 
Bitrate: Quality 0,00 
Current Listeners: 28 
Peak Listeners: 45 
Stream Genre: Tech House, Progressive House, Electro, Minimal</annotation> 
     <info>http://www.hbr1.com</info> 
    </track> 
    </trackList> 
</playlist> 

として、あなたは/playlist/trackList/track/title XMLノードがあなたの曲のタイトルであることを見ることができます、/playlist/trackList/track/creatorは通常アーティストです。

+0

私は.xspfをチェックし、リスナー数、リスナーピーク、品質をリストしています。それは私のために最も重要なものをリストアップしていません、それは歌のタイトルです。何か不足していますか? –

+0

'.xspf'に必要なものはすべてあります。私は自分の答えを更新しました。 –

+0

jsonバージョン2.4以上をサポートするストリームは、.xspfファイルのタイトルを返さないストリームであることに気づきました。他にもあります。どうもありがとうございました。正解と表示されます。 –

0

:ストリームバージョンはIcecastの2.3.3

これは、メタデータとヘッダを取得するために、クラス内のコードであります。

適切なストリームでは、生データを送出する代わりにコンテナ(OggまたはWebMなど)を使用します。

新しいIcecastサーバはJSON API(バージョン2.4.1以上)を提供します。これは、メタデータのストリーム全体を取り込むよりも便利です。

とにかくストリームをデコードしている場合は、ストリーム、libogg、libopus、libvorbisを解析するための適切なライブラリを調べる必要があります。

+0

あなたの答えをありがとう。問題は、ストリームのバージョンを制御できないため、それらをすべて解析できる必要があることです。私はOggとWebM、libogg、libopus、phpキーワードでlibvorbisを試してみましたが、PHPでsteramsを解析するのに役立つものは何も見つかりませんでした。 –

関連する問題