获取Icecast歌曲标题而不缓冲音频



我想写一个小的JavaScript库,可以为Icecast流获取"正在播放"的数据。据我所知,我可以通过向无线电流发送HTTP请求来做到这一点,如下所示:

GET /radiotunes_bebop HTTP/1.1
Host: pub2.radiotunes.com
Icy-MetaData:1

然后,服务器将使用一些响应标头进行应答。其中之一是icy-metaint字段,该字段指示元数据插入流中的间隔。元数据看起来像这样:

StreamTitle='Dexter Gordon - Jodi';StreamUrl='';

虽然这能为我提供所需的信息,但如果你不需要音频本身,这就不是很有效了。(流不播放时可能会出现这种情况。)有没有一种方法可以在不缓冲音频的情况下获取流标题?我知道我可以抓取HTML来获得它,但这种方法有很大的局限性。

由于Icecast 2.4,获取有关服务器上运行的流的机器可读元数据的首选方法是status-json.xsl。此json API在所有安装上默认启用。从第2.4节开始,默认情况下,它是一个开放的API,并发送"*"的ACAO头。

在旧的Icecast安装(2.3.x)的情况下:它们可以使用JSON API进行改装(管理员将status-JSON.xsl和xml2json.xslt从2.4.1版本复制到web目录就足够了)。

SHOUTcast/Icecast元数据总是在第一个音频块之后。如果之前没有音频块,就无法获得流中元数据。

好消息是,这并不像你想象的那样效率低下。大多数电台使用8KB的元数据间隔。许多使用16KB的间隔。我想我从未见过元数据间隔大于32KB。服务器端将缓冲音频流,并在连接后立即刷新此缓冲区。您经常会在第一个或第二个响应包中收到元数据。

如果对您有帮助的话,我有一个免费的API,可以从流中获取元数据,这正是您所建议的。它连接到一个流,跳过音频数据,解析元数据,并返回JSON。它可以从浏览器中访问。

请求

$.getJSON('http://api.audiopump.co/metadata/getStreamMetadata', {
  url: 'http://cdn.audiopump.co/radioreddit/main_mp3_128k',
  apiKey: 'YOUR_API_KEY'
}).done(function (data) {
  console.log(data);
});

响应

{
  "streamInfo": {
    "contentType": "audio/mpeg",
    "name": "Radio Reddit - Main",
    "genres": [
      "Indie",
      "Rock",
      "Talk"
    ],
    "websiteUrl": "http://radioreddit.com",
    "isPublic": true
  },
  "current": {
    "filename": "the_Nothingdoers_(evanowe)_Things_We_Should_Forget.mp3",
    "StreamTitle": "the Nothingdoers (/u/evanowe) - Things We Should Forget"
  }
}

最新更新