如何从流中获取 SHOUTcast "now playing" 元数据?

How do I obtain SHOUTcast "now playing" Metadata from the stream?

说,我要查询当前正在播放的流“http://streaming.shoutcast.com/80sPlanet”(网络电台"A.0.0.00Radio:All 80s All The Time")。 我可以将 header "icy-metadata" 设置为“1”,然后 returns 向此 URL 发出 HTTP GET 请求,其中包括以下 "icy-*" headers:

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/"

但是没有关于流中当前正在广播的内容的信息(我的意思是 song/artist/album/etc)。虽然,在流主页 (http://80splanet.com) 上总是有 up-to-date 信息。 我被告知可以通过向流 URL 添加“/7.html”或“/stats”的 HTTP GET 请求获取 "now playing" 信息。它适用于某些流。例如:

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 服务器文档中有解释) 但大多数流不支持此功能(不是“/7.html”或“/stats”)。 HTTP 错误 404 returns 或类似错误。

看起来 SHOUTcast 提供了一些 API (wiki.shoutcast.com/wiki/SHOUTcast_Developer) 来请求它的广播目录、获取热门电台排行榜等等。还有"SHOUTcast XML Metadata Specification"。似乎有办法以某种方式从流中获取元数据。

此外,还有一种方法可以挖掘流原始数据并根据 "icy-metaint" header 值搜索元数据,如此处所述:Whosebug。com/a/4914538/8128293,但是(首先)我无法访问流的原始数据(android.media.MediaPlayer class 仅接收流 URL 并在其内部保持连接)。 (第二)我不确定这种方法,因为它没有在任何地方记录。并且(第三)我不确定它是否适用于 non-mpeg 音频流(例如:audio/aacp)。

我还听说有一种方法可以通过 JSON 请求流来获取这种元数据,但仍然没有示例可看。

but (first) I have no access to the raw data of the stream (the android.media.MediaPlayer class recieves only the stream URL and maintain connection within itself)

您将不得不请求流数据并自行从中解复用元数据。内置 Android 类 不会关心带内元数据。

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

(Second) I am not sure about this approach due it is not docummented anywhere.

这是方法,是唯一合理的方法。 20年没变。 Icecast 服务器也支持容器中的元数据,但这与您要执行的操作无关。

And (third) I'm not sure if it would work with non-mpeg audio streams (for ex: audio/aacp).

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

Also I heard that there is a way to get this kind of metadata via JSON request to the stream

没有。至少,如果您想与那里的所有服务器兼容,则不会。

Though, on the stream homepage (http://80splanet.com) there is always up-to-date information.

有很多方法可以做到这一点。大多数站点都使用自己的系统在带外执行此操作。 (几乎有任何方法可以管理您的音乐库和处理日程安排。通常从网络脚本实际驱动编码器元数据,其中您的 "now playing" 数据库在播放到编码器时实时更新。)另一种方法是使用您链接到的答案中的方法获取元数据服务器端。我曾经提供一个可以执行此操作的 API 服务器。 (我还有代码,如果你想从我这里获得许可。给我发电子邮件到 brad@audiopump.co。)一种现代的方法是使用 MediaSource Extensions 并在传递流之前在浏览器中处理元数据解复用关闭给播放器。 SHOUTcast 和 Icecast 都不支持这个,因为它们都不支持 CORS。我自己的CDN支持这种方式,代码也可以授权。