我想写一个小的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更大。 服务器端会缓冲音频流,一旦你连接刷新该缓冲区。 你会经常在第一或第二应答包内收到的元数据。
如果这是对您有所帮助,我有一个可从流获取元数据免费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"
}
}
由于2.4的Icecast的首选方式获得机器可读的元数据有关通过一个服务器上运行的数据流是状态,json.xsl。 这JSON API是对所有安装默认启用。 由于2.4.1是默认开放的API和发送“*”的ACAO头。
在旧的Icecast安装(2.3.x版本)的情况:他们可以用JSON API进行改造(这将是足以让管理员从2.4.1版本状态,json.xsl和xml2json.xslt复制到Web目录) 。