2

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

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

然后服务器将回答一些响应头。其中之一是icy-metaint指示元数据插入流中的时间间隔的字段。元数据将如下所示:

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

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

4

2 回答 2

2

从 Icecast 2.4 开始,获取有关通过服务器运行的流的机器可读元数据的首选方法是 status-json.xsl。此 JSON API 在所有安装中默认启用。从 2.4.1 开始,它默认是一个开放的 API,并发送一个“*”的 ACAO 标头。

在旧版 Icecast 安装 (2.3.x) 的情况下:可以使用 JSON API 对其进行改造(管理员只需将2.4.1版本中的 status-json.xsl 和 xml2json.xslt 复制到 web 目录即可) .

于 2014-11-25T13:15:13.903 回答
0

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"
  }
}
于 2014-11-08T17:34:31.697 回答