Audio 我如何获得SHOUTcast“;“现在玩”;来自流的元数据?

Audio 我如何获得SHOUTcast“;“现在玩”;来自流的元数据?,audio,stream,metadata,shoutcast,internet-radio,Audio,Stream,Metadata,Shoutcast,Internet Radio,比方说,我要查询“流”的当前广播(在线广播“A.0.0.00广播:一直都是80年代”)。 我可以对该URL发出HTTP GET请求,将标题“icy metadata”设置为“1”,并返回包括以下“icy-*”标题的消息: key=“冰冷的br”;value=“128” key=“冰冷的体裁”;value=“几十年,80年代” key=“icy metaint”;value=“16000” key=“名称”;value=“A.0.0.00收音机:一直都是80” key=“icy-notice1”;

比方说,我要查询“流”的当前广播(在线广播“A.0.0.00广播:一直都是80年代”)。 我可以对该URL发出HTTP GET请求,将标题“icy metadata”设置为“1”,并返回包括以下“icy-*”标题的消息:

key=“冰冷的br”;value=“128”
key=“冰冷的体裁”;value=“几十年,80年代”
key=“icy metaint”;value=“16000”
key=“名称”;value=“A.0.0.00收音机:一直都是80”
key=“icy-notice1”;value=“
此流需要
” key=“icy-notice2”;value=“SHOUTcast DNAS/posix(linux x64)v2.5.1.725
” key=“冰酒吧”;value=“1” key=“冰冷的sr”;value=“44100” key=“冰冷的url”;值=”http://a.0.00radio.com/80s/"
但是没有关于当前正在流媒体上播放的内容的信息(我指的是歌曲/艺术家/专辑/等等)。不过,在stream主页()上总是有最新的信息。 我被告知,可以通过向流URL添加“/7.html”或“/stats”的HTTP get请求来获取“正在播放”信息。它适用于某些溪流。例如:

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>
http://198.100.125.242/7.html
383,15413000377128,风云人物-帕特里克和塞巴斯蒂安
(这些数字是流统计数据。SHOUTcast服务器文档中对此进行了解释) 但大多数流不支持此功能(不是“/7.html”也不是“/stats”)。HTTP错误404返回或类似错误

看起来SHOUTcast提供了一些API(wiki.SHOUTcast.com/wiki/SHOUTcast_Developer)来请求它的广播目录,获取顶级电台图表等等。还有“ShoutCastXML元数据规范”。似乎有一种方法可以从流中获取元数据

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

我还听说有一种方法可以通过JSON请求将此类元数据发送到流,但仍然没有示例可供参考

但是(首先)我无法访问流的原始数据(android.media.MediaPlayer类只接收流URL并在其内部保持连接)

您必须请求流数据并自己从中解复用元数据。内置的Android类不会关心带内元数据

我不是Android开发者,但看起来你可以自己制作MediaDataSource

(第二)我不确定这种方法,因为它在任何地方都没有记录

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

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

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

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

没有。至少,如果您想与所有服务器兼容,就不需要这样做

不过,在stream主页()上总是有最新的信息


有很多方法可以做到。大多数电台都是在带外使用自己的系统来实现这一点的。(管理音乐库和处理日程安排几乎有任何方法。从web脚本实际驱动编码器元数据是很常见的,在将“正在播放”的数据库回放到编码器时,会实时更新该数据库。)另一种方法是使用链接到的答案中的方法获取元数据服务器端。我曾经提供一个API服务器来实现这一点。(如果您想从我这里获得许可,我仍然拥有代码。请发电子邮件至brad@audiopump.co.)一种现代的方法是使用MediaSource扩展并在将流传递给播放器之前在浏览器中处理元数据解组。SHOUTcast和Icecast都不支持这一点,因为它们都不能正确支持CORS。我自己的CDN支持这种方法,代码也可用于许可。

关于开发自定义MediaDataSource-请看这里:是的,这里也是:
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>