Icecast2、MPD 和元数据

问题描述 投票:0回答:2

目前正在我的 Raspberry Pi 3 上使用 HTTPS 运行 Icecast2 的 MPD 源。
一切都很顺利,但是在使用 status-json.xsl 文件从 Icecast 检索元数据(并直接打开它)时,我能找到的相关元数据就是歌曲的艺术家和标题。
我还希望能够检索当前歌曲的专辑;在浏览 MPD 文档后,我取消了 /etc/mpd.conf 中的metadata_to_use 的注释,并根据我的需要进行了定制:
metadata_to_use "artist,album,title,name"

完成此操作后,我重新启动了 Icecast2 和 MPD,但在 status-json.xsl 文件上,没有其他可用标签。
我认为标签在需要时会作为附加信息出现在 status-json.xsl 文件上,但我显然错了。
就元数据而言,我在 Icecast2 部分没有找到任何相关属性。

有人可以澄清我应该在哪里找到我需要的附加标签吗?
或者,如果我配置错误,我应该寻找什么?
非常感谢!

icecast mpd
2个回答
1
投票

好吧,长话短说,没有办法。
在 Interweb 上阅读后,我发现 mpd 带有自己的 httpd 服务器,事实上,在使其工作后,根本就不再需要 Icecast2 了。

对于那些对如何管理感兴趣的人,这里是:
mpd.conf:

  • 启用解码器{}块的
    "gapless "yes"
    :
  • 注释掉用于安装到 Icecast2 的整个
    audio_output{}
    (Shout 那个)
  • 启用
    audio_output{}
    输入“httpd”,
  • 如果您希望以后保持 Icecast 兼容性,请设置不同的端口,例如 8100,
  • 确保您拥有
    encoder "vorbis"
    ,因为就元数据而言,Lame 不适合我,
  • 确保您启用了比特率或质量,而不是两者都启用(无论如何都不会启动)
  • 并在 max_clients 之后添加:
    always_on "yes"

    tags "yes"


    现在,对于元数据解析:这是here慷慨提供的一个函数,用于分解数据。
    请注意,它还不会自动刷新,但它可以工作。

<!DOCTYPE html>
<html>
    <body>
      <?php
        function get_string_between($string, $start, $end)
        {
            $string = ' ' . $string;
            $ini = strpos($string, $start);
            if ($ini == 0) return false;
            $ini += strlen($start);
            $len = strpos($string, $end, $ini) - $ini;
            return substr($string, $ini, $len);
        }
    
        $fp = fsockopen("192.168.1.10",8100,$errno,$errstr,1);
        if (!$fp)
        {
            echo "$errstr ($errno)<br />\n";
        }
        else
        {
            $out = "GET / HTTP/1.1\r\n";
            $out .= "Host: www.example.com\r\n";
            $out .= "Connection: Close\r\n\r\n";
            fwrite($fp, $out);
            
            $stop=false;
            $album='';
            $artist='';
            $title='';
            
            while(!$stop)
            {
                if(feof($fp)) $stop=true;
                
                $buff=fgets($fp, 512);

                $album=get_string_between($buff,'ALBUM=','vorbis+');
                if($album!=false) $stop=true;
                
                $title=get_string_between($buff,'TITLE=','ALBUM=');
                if($title!=false) $stop=true;
                
                $artist=get_string_between($buff,'ARTIST=','TITLE=');
                if($artist!=false) $stop=true;
            }
            
            if($album==false) $album='n/a';
            if($title==false) $title='n/a';
            if($artist==false) $artist='n/a';
            
            fclose($fp);
            
            echo("<table><tr><td align=center><b>$artist</b> - $title</td></tr>");
            echo("<tr><td align=center><i>$album</i></td></tr></table>");
        }
        ?>
    </body>
</html>

诚然,这是初稿,尽管它工作得并不完美,但它确实对我有用,所以我希望它对其他人有帮助!


0
投票

可能不错,但是这个代码应该放在哪里?

© www.soinside.com 2019 - 2024. All rights reserved.