我如何获得SHOUTcast"现在正在玩#34;来自流的元数据?

时间:2017-06-08 04:10:28

标签: audio stream metadata shoutcast internet-radio

说,我即将询问当前广播的流" http://streaming.shoutcast.com/80sPlanet" (在线广播" A.0.0.00Radio:All 80s All Time")。 我可以使用标题" icy-metadata"对此URL进行HTTP GET请求。设置为" 1",它返回包括以下" icy - *"头:

key = "icy-br"; value = "128"
key = "icy-genre"; value = "Decades,80s"
key = "icy-metaint"; value = "16000"
key = "icy-name"; value = "A.0.0.00Radio:All 80s All The Time"
key = "icy-notice1"; value = "<BR>This stream requires <a href="http://www.winamp.com">Winamp</a><BR>"
key = "icy-notice2"; value = "SHOUTcast DNAS/posix(linux x64) v2.5.1.725<BR>"
key = "icy-pub"; value = "1"
key = "icy-sr"; value = "44100"
key = "icy-url"; value = "http://a.0.00radio.com/80s/"

但目前没有关于流媒体播放内容的信息(我的意思是歌曲/艺术​​家/专辑/等)。但是,在流主页(http://80splanet.com)上始终存在最新信息。 我被告知有可能让#34;现在正在播放&#34;信息通过HTTP GET请求添加&#34; /7.html"或&#34; / stats&#34;。它适用于某些流。例如:

http://198.100.125.242/7.html
<HTML><meta http-equiv="Pragma" content="no-cache"></head><body>383,1,541,30000,377,128,Man of the Hour - w/ Patrick and Sebastian </body></html>

(这些数字是流统计信息。它们在SHOUTcast服务器文档中有解释) 但是大多数流不支持此功能(不是&#34; /7.html"也不是&#34; / stats&#34;)。 HTTP错误404返回或类似。

看起来SHOUTcast提供了一些API(wiki.shoutcast.com/wiki/SHOUTcast_Developer)来请求它的无线电目录,获得热门站点图表等等。还有&#34; SHOUTcast XML元数据规范&#34;。似乎有一种方法可以以某种方式从流中获取元数据。

此外,还有一种方法可以挖掘流原始数据并根据&#34; icy-metaint&#34;来搜索元数据。这里解释的标头值:stackoverflow.com/a/4914538/8128293,但是(第一个)我无法访问流的原始数据(android.media.MediaPlayer类仅接收流URL并维护其内部的连接)。 (第二)我不确定这种方法,因为它没有任何文件证明。并且(第三)我不确定它是否适用于非mpeg音频流(例如:audio / aacp)。

另外我听说有一种方法可以通过JSON请求将这种元数据传递给流,但仍然没有示例可供查看。

1 个答案:

答案 0 :(得分:1)

  

但是(第一)我无法访问流的原始数据(android.media.MediaPlayer类仅接收流URL并在其自身内维护连接)

您将不得不自己请求流数据并从中分离元数据。内置的Android类不会关心带内元数据。

我不是Android开发人员,但看起来您可以制作自己的MediaDataSource。 https://developer.android.com/reference/android/media/MediaDataSource.html

  

(第二)我不确定这种方法,因为它在任何地方都没有文件化。

这是 方法,这是唯一合理的方法。它在20年内没有改变。 Icecast服务器也支持容器中的元数据,但这与您尝试做的事情无关。

  

并且(第三)我不确定它是否适用于非mpeg音频流(例如:audio / aacp)。

效果很好。它与内容类型完全无关。这种ICY风格的元数据处理不知道或不关心它嵌入的内容。在编解码器处理流之前,应将元数据从流中分离出来。

  

我还听说有一种方法可以通过JSON请求获取这种元数据到流

没有。至少,如果你想与那里的所有服务器兼容,那就不是了。

  

虽然在流主页(http://80splanet.com)上总是有最新信息。

有很多方法可以做到这一点。大多数电台都使用自己的系统进行带外传输。 (几乎没有任何方法可以管理您的音乐库并处理调度。通常从Web脚本驱动编码器元数据是很常见的,您的“正在播放”的数据库在回放到编码器时会实时更新。)方法是使用您链接的答案中的方法获取元数据服务器端。我曾经提供过这样做的API服务器。 (我仍然有代码,如果你想从我那里获得许可。请发送电子邮件至brad@audiopump.co。)一种现代的方法是使用MediaSource Extensions并在将流传递给之前处理浏览器中的元数据解复用玩家;选手。 SHOUTcast和Icecast都没有支持这一点,因为它们都没有正确支持CORS。我自己的CDN支持这种方法,代码也可用于许可。