我在网上找不到更好的答案,即使是液体肥皂的文档也没有帮助。我想发生的是获取当前在我的流媒体服务器(icecast(中播放的歌曲标题和艺术家。我在某个论坛上发现他们能够做到这一点,但他们没有解释如何做到这一点,这是他们使用的液体肥皂脚本:
def apply_metadata(m) =
title = m["title"]
artist = m["artist"]
album = m["album"]
[("artist","#{artist}"),("title","#{album} - #{title}")]
end
centovacast.callback_autodj := fun(s) -> map_metadata(apply_metadata,s)
我相信这个脚本也仅适用于 centova 和 autodj。虽然我不使用这些技术(我使用的是Ubuntu 16.04,Icecast2,Liquisoap,PHP,HTML5/CSS(,使用我当前使用的工具是否可以做到这一点?
我曾经使用 websockets 来获取元数据,但我发现它总是不同步,这让我感到沮丧。
解决它的唯一方法是将元数据编码到流中,以便您与音频同时接收它。
我做了一些挖掘,以了解 icecast 服务器是如何做到这一点的,并将一个服务工作者脚本放在一起,该脚本将必要的标头添加到您的请求中,以获取包含元数据的流,然后为您提取它。
代码在这里,这里有一个简单的演示
这有所帮助,无论如何,我认为在这里,weserWEB,已经以某种方式说过类似的话。如果您使用的是 Icecast 版本 2.4.4,则可以使用此端点中的元数据:(如果没有,请考虑下载该版本(
http://<your-ipaddress-or-domain>:<port_number>/status-json.xsl
只需将其放入任何浏览器中,您将获得一个JSON,其中包含您正在流式传输的歌曲名称和标题,当然,您必须先正确配置您的流媒体客户端。然后,您可以从该端点获取元数据,而不会在 PHP 中出现问题。您可以使用 CURL 获取 JSON 数据,不需要液体肥皂。
我不确定为什么要将源客户端拖到这里。
发送到 Icecast 挂载点的正确流将具有当前播放音频的元数据。
这一点在别处已经指出。自 2.4.1 以来的 Icecast 提供了正确的 JSON 元数据导出。
从网站内部查询JSON在很大程度上是一个已解决的问题,对于有倾向的读者来说,这被认为是一个练习。
你为什么不直接在 icecast 上抓住这个?
.PHP:
function get_icecast_info($server_ip, $server_port, $admin_user, $admin_password) {
$index = @file_get_contents("http://".$admin_user.":".$admin_password."@".$server_ip.":".$server_port."/admin/stats.xml");
if($index) {
$xml = new DOMDocument(); if(!$xml->loadXML($index)) return false; $arr = array(); $listItem = $xml->getElementsByTagName("source");
foreach($listItem as $element) {
if($element->childNodes->length) {
foreach($element->childNodes as $i){ $arr[$element->getAttribute("mount")][$i->nodeName] = $i->nodeValue; }
}
}
return $arr;
} return false;
}
这是输出(数组(:
$arr = get_icecast_info($ice_host, $ice_aport, $ice_user, $ice_pass);