在不缓冲音频的情况下获取Icecast歌曲标题

时间:2014-11-08 12:37:49

标签: audio streaming shoutcast icecast internet-radio

我想编写一个小型JavaScript库,可以为Icecast流提取“正在播放”的数据。根据我understand,我可以通过向无线电流发送HTTP请求来执行此操作,如下所示:

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

然后,服务器将回答一些响应标头。其中一个是icy-metaint字段,表示元数据插入流的时间间隔。元数据看起来像这样:

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

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

2 个答案:

答案 0 :(得分:1)

从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。 发布到网络目录。)

答案 1 :(得分:0)

SHOUTcast / Icecast元数据总是出现在第一个音频块之后。如果没有音频块,就无法获取插播元数据。

好消息是,这并不像你想象的那么低效。大多数站使用8KB元数据间隔。许多人使用16KB间隔。我认为我没有看到大于32KB的元数据间隔。服务器端将缓冲音频流并在连接后立即刷新此缓冲区。您通常会在第一个或第二个响应数据包中收到元数据。

如果它对您有帮助,我会free API available for fetching metadata from streams完全符合您的建议。它连接到流,跳过音频数据,解析元数据,并返回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"
  }
}