0

我在网上找不到更好的答案,即使液体肥皂的文档也没有帮助。我想要发生的是获取我的流媒体服务器(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),但使用我目前使用的工具可以做到这一点吗?

4

4 回答 4

3

我曾经使用 websockets 来获取元数据,但我发现它总是不同步令人沮丧。

解决它的唯一方法是将元数据编码到流中,以便您在接收音频的同时接收它。

我做了一些挖掘,以了解 icecast 服务器是如何做到的,并整理了一个服务工作者脚本,该脚本将必要的标头添加到您的请求中,以获取包含元数据的流,然后为您提取它。

代码在这里,这里有一个简单的演示

于 2018-07-14T20:48:16.953 回答
0

我希望这会有所帮助,无论如何,我认为 weserWEB 在这里已经以某种方式说了类似的话。如果您使用的是 Icecast 2.4.4 版,您可以使用此端点的元数据:(如果没有,请考虑下载该版本)

http://<your-ipaddress-or-domain>:<port_number>/status-json.xsl

只需将它放在任何浏览器中,您就会得到一个 JSON,其中包含您正在流式传输的歌曲和标题的名称,当然,您必须首先正确配置您的流式传输客户端。然后,您可以从该端点获取元数据,而不会在您的 PHP 中出现问题。您可以使用 CURL 获取 JSON 数据,不需要使用 Liquidsoap。

于 2021-09-24T19:49:06.810 回答
0

你为什么不直接在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);
于 2018-01-19T11:22:30.780 回答
0

我不确定您为什么要将源客户端拖入其中。

发送到 Icecast 挂载点的正确流将包含当前播放音频的元数据。

这已在别处指出。从 2.4.1 开始的 Icecast 提供了正确的 JSON 元数据导出。

从网站内查询 JSON 在很大程度上是一个已解决的问题,并且被认为是对有兴趣的读者的练习。

于 2018-01-18T18:00:27.627 回答