还有就是要询问有关当前播放歌曲的流媒体广播服务的一些标准的方式? 我现在做的每一个站,如(SomaFM)以不同的方式:
$wg=join("\n",`wget -q -O - https://somafm.com/secretagent/songhistory.html`);
$wg=~/\(Now\).*>([^<]*)<\/a><\/td><td>([^<]*)/s;
print "Secret Agent\n$1\n$2\n"
或(无线瑞士精英赛):
$wg=join("\n",`wget -q -O - http://www.radioswissclassic.ch/en`);
$wg=~/On Air.*?titletag">([^<]*).*?artist">([^<]*)/s;
print "Radio Svizzera Classic\n$1\n$2\n"
...但我不知道是否有可能做到这一点,不是靠下载绑定改变迟早html页面更标准的方式
对于Shoutcast一样/的Icecast风格的台站ICY的数据(这构成了大量的网络电台),做的最好的事情是得到流本身这个数据。
首先,你需要一个URL的实际流。 如果你去SomaFM的秘密代理页在http://somafm.com/secretagent/ ,你会看到链接的其他球员听。 作为一个例子,让我们使用128K AAC链接,指向了http://somafm.com/secretagent130.pls 。 这是不实际的流...它是包含指向实际流的播放列表文件。 打开它,在你喜欢的文本或代码编辑器,看看我的意思是:
[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的副本或其他一些数据包嗅探器。 打在你的音频播放器中有一个网址,并检查了交通。 我们将看到的第一件事是请求和响应。
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
这些互联网广播服务器或者是HTTP(在的Icecast和其他人的情况下)或非常接近它(传统Shoutcast一样),并接受正常的GET
请求。 在这种情况下,我的播放器(VLC)使一个GET
用于请求/secretagent-128-aac
,这是路径的实际流。
我的播放器还包括一个关键的请求头:
Icy-MetaData: 1
此Icy-MetaData
报头要求服务器多路复用器的元数据与音频流数据。 也就是说,“正在播放”曲目信息将被定期发送注入流。
在服务器响应头,还有另外一个关键的头:
icy-metaint:45000
这告诉我们两件事情......首先是服务器同意将元数据。 第二个是,所述元数据间隔为45000个字节。 每45000个字节,服务器将注入的元数据的一大块。 让我们回到我们的数据包嗅探器,看看这个样子:
元数据块,所述的第一个字节0x06
,告诉我们的元数据块有多长。 采取这一字节的值,用16乘以它,你就必须以字节为单位的元数据块的长度。 也就是说, 0x06
的第一块元数据字节告诉我们,接下来的96个字节将是元数据,返回到常规流数据之前。 注意,这意味着整个的元数据是用于其余97个字节...对长度指示符1个字节,然后96个字节(在此情况下)。
现在,让我们来看看实际的文本元数据格式:
StreamTitle='Buscemi - First Flight To London';StreamUrl='http://SomaFM.com/secretagent/';
这看起来很简单。 key='value'
,分号;
分隔。 没有与此,虽然一些大的渔获物。 例如...有转义单引号没有真正的标准方法。 如果元数据值需要包含一个单引号,有时是\'
有时是'''
。 有时它没有逃过了!
此外,并非所有服务器使用相同的字符编码。 你也许可以安全地假定UTF-8,但不要指望有些服务器可能是不同的,或者只在自己的元数据编码打破。
不管怎样,现在你知道这一切是如何工作的,你可以实现。 如果你愿意,我有一些代码,您可以授权。 一个是给定一个流URL时将返回元数据为你做所有的缓冲和解析服务器端的一个Node.js的API服务器。 另一种是基于MSE客户端播放器......不过,请注意,这仅适用于支持CORS,而据我所知,只有我自己的服务器(AudioPump CDN),今天做服务器的工作原理。 如果你有兴趣在此代码的任何,随时brad@audiopump.co发邮件给我。 如果您对这里堆栈溢出我的回答的问题,在这里发表评论。