我想编写一个小型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来获取它,但这种方法有很大的局限性。
答案 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"
}
}