如何显示现在使用Icecast2和Liquidsoap在我的网站上播放

时间:2018-01-18 17:42:17

标签: php html5 icecast liquidsoap

我无法在网上找到更好的答案,即使是液体肥皂的文件也没有用。我想要发生的是获取当前的歌曲标题和艺术家在我的流媒体服务器(icecast)中播放。我在一些论坛上发现他们能够做到,但他们没有解释如何,这里是他们使用的Liquidsoap脚本:

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), 这可以使用我目前使用的工具吗?

3 个答案:

答案 0 :(得分:0)

我不确定你为什么要将源客户端拖入此内容。

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

有人指出elsewhere。自2.4.1以来的Icecast提供了正确的JSON元数据导出。

从网站内部查询JSON是一个非常解决的问题,并被认为是倾向于读者的练习。

答案 1 :(得分: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);

答案 2 :(得分:0)

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

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

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

代码为here,有一个简单的演示here