首页 > 解决方案 > 处理 Icecast 元数据的 Websocket 方法?

问题描述

我运行一个公共服务扫描仪网站,允许人们收听警察、火灾等。它通过 Ubuntu 上的 Icecast 从后端流式传输,我在 IIS/PHP 上运行 Joomla 的前端网站。

我在流媒体服务器上有一个 python 脚本,它解析来自扫描仪收音机显示屏的信息,以获取当前频率/通话组并将其应用于流的歌曲标题。然后,前端网站上的 AJAX 请求每 5 秒向 icecast 服务器查询歌曲名称,因为这种情况经常发生变化。

最近,该地区发生的事件引起了该网站的大量访客。在网站上不断更新歌曲标题的查询破坏了我的互联网连接,所以我开始研究其他方法,并偶然发现了 websockets。我的理解是,与其让客户不断地要求歌曲名称,websockets 将允许我只在更改时推送。

我开始玩 icecast-stack,这是一个 mpn 模块,它是 node.js 的一部分。虽然这看起来很有希望,但我很难掌握如何实现这一点。似乎有一个完整的 icecast/html5/node.js 播放器正在制作中,但尚未完成。

我的第二个想法是使用 node.js 构建聊天客户端/服务器。这个概念是有道理的,因为访问者将是聊天“客户端”,以及 icecast 服务器本身,将消息发送到聊天服务器。我在icecast服务器上使用我的python脚本来解决这个问题;如何将 python 中的变量发送到 node.js 聊天服务器?

如果有人有一些示例代码要分享,或者可能有另一个想法,我将不胜感激。

非常感谢!

标签: phppythonnode.jsiisicecast

解决方案


WebSockets 用于双向通信,您不需要。请改用服务器发送的事件

在客户端上,您将执行以下操作:

const metaEventSource = new EventSource('/metadata');
metaEventSource.addEventListener('message', (e) => {
  console.log(e.data);
});

在服务器端,有许多可用的抽象取决于您最终选择的堆栈。这是一个简单的基于文本的响应格式:

event: metadata
data: Your new metadata goes here

推荐阅读