websocket - 实时音频流网络应用程序的架构
问题描述
需要您对实时音频流应用程序的架构提出意见。
目前,我正在本地网络上对其进行测试,一切似乎都可以正常工作,但我怀疑它在生产中的效果如何。
我的架构:
1 2
Broadcaster HTTP client ---> App Server ---> Listening clients (React.js App)
1
— 通过 HTTP 进行通信,2
— 通过 HTTP 和 WebSocket 进行通信
我想做的事:
- 当用户打开我的 React 应用程序并且广播器还没有流式传输时,React 应该显示类似“OFFLINE”的内容
- 接下来,当 Broadcaster 开始流式传输到 App Server 时,React App 应显示“流已启动”并自动开始播放。
- 最后,当 Broadcaster 停止流式传输时,React App 应该再次显示“OFFLINE”。
我目前是如何做到的: 我的应用服务器使用两种协议:HTTP(用于音频流和其他内容)和 WebSocket(仅用于发送服务器上发生的 JSON 状态消息)。
- 当 Broadcaster 开始流式传输到 App Server(通过 HTTP)时,App Server 向 React App 发送 WebSocket 消息:“流已经开始,您可以在 ie 处访问它,
http://my-domain/stream
即 App Server 通过常规 HTTP 将音频流式传输到 React。 - React App 看到此消息并呈现 HTML
<audio>
元素并开始播放音频。 - 当 Broadcaster 停止流式传输时,App Server 向 React App 发送 WebSocket 消息“流式传输完成”,React 隐藏播放器,显示“OFFLINE”
因此,我通过 HTTP 进行所有流式传输(从 Broadcaster 到 App Server 以及从 App Server 到 React 客户端),并使用 WebSocket 来传达实时流状态更新。
这种架构有多好?
解决方案
这种架构有多好?
这不是好坏的问题,而是它是否适合您的用例的问题。我注意到这基本上就是 SHOUTcast 和 Icecast 等互联网广播服务器已经工作了 20 多年的方式,所以它不会那么糟糕。:-)
推荐阅读
- r - 计算不同数据帧中出现的次数,并将行号作为字符串获取
- split - 在 PDI 中加载数据时基于列 (DATE) 拆分行
- javascript - 系统自时间较长的 Chrome 性能分析
- sql - 向上取整或向下取整此查询中的 SpecialOfferPrice 列?
- android - 启用暗模式时如何将图像保持为原始形式
- javascript - 位置的阈值比例
- javascript - Jquery 到 javascript 或 Jquery 到伪代码
- mockito - 未调用方法调用时的 Mockito,验证返回消息“想要但未调用,实际上,与此模拟的交互为零”
- typescript - 生成一个类型,其中每个可为空的值都变为可选
- amazon-cloudformation - 如何使用 cloudformation 从 aws 动态读取 ami id