php - 处理 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 聊天服务器?
如果有人有一些示例代码要分享,或者可能有另一个想法,我将不胜感激。
非常感谢!
解决方案
WebSockets 用于双向通信,您不需要。请改用服务器发送的事件。
在客户端上,您将执行以下操作:
const metaEventSource = new EventSource('/metadata');
metaEventSource.addEventListener('message', (e) => {
console.log(e.data);
});
在服务器端,有许多可用的抽象取决于您最终选择的堆栈。这是一个简单的基于文本的响应格式:
event: metadata
data: Your new metadata goes here
推荐阅读
- nestjs - 如何在配置案例中使用 DynamicModule?
- android - 无法禁用点击日期选择器
- prolog - 为什么我不能将 OWL 类存储在变量中?
- java - PDFTranscoder (org.apache.fop) 是否支持超链接?
- selenium-webdriver - 无法使用 Jmeter/Selenium/Java 打开 chrome 设置或下载页面
- http - Http 会话过期
- windows - 读取 pendrive 时 CreateFile() 失败,错误代码 32
- javascript - 在 React 中更改全局状态时,子组件导致父组件渲染过多
- vue.js - 我这样做对吗?VueX 和 Vue.js
- swift - 如何在 UnsafePointer 中访问多个缓冲区
(不可变)