ICYメタデータ(インターネットラジオ局の大半を占める)を持つSHOUTcast/Icecast形式のステーションでは、このデータをストリーム自体から取得するのが最善の方法です。
まず、実際のストリームへのURLが必要です。あなたがSomaFMのSecret Agentページhttp://somafm.com/secretagent/に行くと、他のプレイヤーで聞くためのリンクが表示されます。例として、http://somafm.com/secretagent130.plsを指す128k AACリンクを使用しましょう。これは実際のストリームではありません。実際のストリームへのリンクを含むプレイリストファイルです。私が何を意味するか見るためにあなたの好きなテキストやコードエディタで開きます。
[playlist]
numberofentries=2
File1=http://ice1.somafm.com/secretagent-128-aac
Title1=SomaFM: Secret Agent (#1 ): The soundtrack for your stylish, mysterious, dangerous life. For Spies and PIs too!
Length1=-1
File2=http://ice2.somafm.com/secretagent-128-aac
Title2=SomaFM: Secret Agent (#2 ): The soundtrack for your stylish, mysterious, dangerous life. For Spies and PIs too!
Length2=-1
Version=2
インターネットラジオ局は、一般的に、フェイルオーバーのために、ここで複数のサーバが含まれます。リスナーとの接続が切断された場合、プレーヤーは通常、次のアイテムに移動します。これは、あるサーバーがリスナーの制限に達すると便利です。プレイヤーは最終的には、別のサーバーがアクティブになることを望みます。
とにかく、Wiresharkやその他のパケットスニファのコピーを焼いてください。オーディオプレーヤーのURLの1つを押して、トラフィックを調べます。最初に見ていくのはリクエストとレスポンスです。
GET /secretagent-128-aac HTTP/1.1
Host: ice1.somafm.com
User-Agent: VLC/2.2.4 LibVLC/2.2.4
Range: bytes=0-
Connection: close
Icy-MetaData: 1
HTTP/1.0 200 OK
Content-Type: audio/aacp
Date: Sat, 20 May 2017 20:43:56 GMT
icy-br:128
icy-genre:Various
icy-name:Secret Agent from SomaFM [SomaFM]
icy-notice1:<BR>This stream requires <a href="http://www.winamp.com/">Winamp</a><BR>
icy-notice2:SHOUTcast Distributed Network Audio Server/Linux v1.9.5<BR>
icy-pub:0
icy-url:http://SomaFM.com
Server: Icecast 2.4.0-kh3
Cache-Control: no-cache, no-store
Pragma: no-cache
Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: Origin, Accept, X-Requested-With, Content-Type
Access-Control-Allow-Methods: GET, OPTIONS, HEAD
Connection: Close
Expires: Mon, 26 Jul 1997 05:00:00 GMT
icy-metaint:45000
これらのインターネットラジオサーバは、(Icecastのと他人の場合)HTTPまたはそれに本当に近い(レガシーシャウトキャスト)のいずれかであり、通常のGET
要求を受け入れます。この場合、私のプレーヤー(VLC)はGET
の要求を/secretagent-128-aac
とします。これは実際のストリームへのパスです。
私のプレーヤーは、1つのキーのリクエストヘッダが含まれています
Icy-MetaData: 1
このIcy-MetaData
ヘッダは、オーディオストリームデータとメタデータをMUXへサーバーを要求します。すなわち、「現在再生中の」トラック情報は、周期的にストリームに注入されることになる。
サーバーのレスポンスヘッダでは、別のキーのヘッダーがあります:
icy-metaint:45000
これは私たちに二つのことを伝えます...最初は、サーバは、メタデータを送信することに同意したということです。 2番目は、のメタデータ間隔が45,000バイトであることです。 45,000バイトごとに、サーバーはメタデータのチャンクを挿入します。私たちのパケットスニファに戻りましょう、これはどのように見えるかを参照してください。
メタデータチャンクの非常に最初のバイト、0x06
、メタデータチャンクがどのくらいを教えてくれる。そのバイトの値に16を掛ければ、メタデータチャンクの長さはバイト単位になります。つまり、最初のメタデータチャンクバイトの0x06
は、通常のストリームデータに戻る前に、次の96バイトがメタデータとなることを示しています。これは、メタデータ全体が97バイト...長さインジケータの場合は1バイト、残りの場合は96バイト(この場合は96バイト)であることに注意してください。
それでは、実際のテキストメタデータ形式に取得してみましょう:
StreamTitle='Buscemi - First Flight To London';StreamUrl='http://SomaFM.com/secretagent/';
それは非常に簡単に見えます。 key='value'
、セミコロン;
で区切られています。しかし、これにはいくつかの大きなキャッチがあります。たとえば、一重引用符をエスケープするための標準的な方法はありません。メタデータの値に一重引用符を含める必要がある場合は、\'
、時には'''
となることがあります。時にはそれはまったくエスケープされません!
また、すべてのサーバーで同じ文字エンコードが使用されるわけではありません。あなたはおそらくUTF-8を安全に想定しているかもしれませんが、一部のサーバーが異なっていたり、単に独自のメタデータエンコーディングで壊れていると思われたりします。
とにかく、これでどのように動作するかを知ったので、実装することができます。あなたが望むなら、私はあなたがライセンスできるコードをいくつか持っています。 1つはNode.js APIサーバーです。ストリームURLを指定するとメタデータが返され、すべてのバッファリングとサーバー側の解析が行われます。もう1つはMSEに基づくクライアント側プレーヤーです...これはCORSをサポートするサーバーでのみ動作しますが、私の知る限り、自分のサーバー(AudioPump CDN)だけが今日行います。このコードに興味がある場合は、brad @ audiopump.coまで電子メールでお気軽にお問い合わせください。スタックオーバーフローに関する私の答えに関する質問がある場合は、ここにコメントを投稿してください。
詳細&完全回答ありがとうございます!私は私のプログラム(私はPythonを使用して)で動作させるようにしようとします... – alessandro