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

Audio 在不缓冲音频的情况下获取Icecast歌曲标题,audio,streaming,shoutcast,icecast,internet-radio,Audio,Streaming,Shoutcast,Icecast,Internet Radio,我想编写一个小的JavaScript库,可以为Icecast流获取“正在播放”的数据。根据我的经验,我可以通过如下方式向无线电流发送HTTP请求来实现这一点: GET /radiotunes_bebop HTTP/1.1 Host: pub2.radiotunes.com Icy-MetaData:1 然后服务器将使用一些响应头进行响应。其中一个是icy metaint字段,该字段指示元数据插入流的时间间隔。元数据将如下所示: StreamTitle='Dexter Gordon - Jodi

我想编写一个小的JavaScript库,可以为Icecast流获取“正在播放”的数据。根据我的经验,我可以通过如下方式向无线电流发送HTTP请求来实现这一点:

GET /radiotunes_bebop HTTP/1.1
Host: pub2.radiotunes.com
Icy-MetaData:1
然后服务器将使用一些响应头进行响应。其中一个是
icy metaint
字段,该字段指示元数据插入流的时间间隔。元数据将如下所示:

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

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

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

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

如果对你有帮助的话,我有一个能完全按照你的建议做的计划。它连接到一个流,跳过音频数据,解析元数据,并返回JSON。可以从浏览器中访问它

要求 回应
由于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目录).

恐怕我在API的响应中遇到了一些非ASCII字符的问题:尽管存在表示UTF-8编码的
内容类型
标题,但未正确解码字符。@Pieter感谢您的错误报告。站点名称编码问题是一个bug,我认为它是Node.js的核心,我的API服务器就是在Node.js上运行的。我正在确认这一点,希望能找到解决办法。但是流元数据本身。。。元数据应该已经在UTF-8中了。然而,许多编码器不这样做。我正在考虑添加一个选项,您可以指定您的编码。这会有帮助吗?你知道你在用什么编码吗?还有,你有一个流我可以复制它吗?我有
$.ajaxSetup({scriptCharset:“utf-8”,contentType:“application/json;charset=utf-8”})在我根据发出请求之前,但我在请求头中没有看到任何关于UTF-8的内容。您可以使用以下流复制错误:@Pieter API将始终返回UTF-8。问题是源流本身被假定为UTF-8格式,因为大多数编码器都使用UTF-8格式。(不幸的是,在SHOUTcast中并没有真正为元数据定义字符编码,因此并非所有编码器都使用UTF-8。)这就是我正在测试的流,但自从我使用它进行测试以来,我没有看到任何重音字符。今天晚些时候我将重试,并将为流的元数据编码添加一个参数。我会再打给你的。你能给我发封电子邮件吗brad@audiopump.co这样我就可以通过电子邮件联系了?谢谢。供将来参考:此方法不再有效。当我尝试访问API时,从nginx服务器获得504网关超时。哦,这是一项免费服务。。。当它持续的时候很有趣。一个主要的警告是:这并不是万能的。一些最大的纯互联网广播网络甚至还不支持它(例如和)。希望这种情况将来会有所改善。同时,我担心我将不得不坚持更为可靠的解决方案。当然,这是为特定流创建网页时使用的。如果你必须处理随机流,你就完蛋了。如果流是Vorbis或OPUS,那么冰冷的刮取将不起作用,因为元数据在Ogg容器中。Firefox有一个JS元数据API,但这是特定于供应商的。
$.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"
  }
}