我一直在试图找出实现我已经有一段时间的想法的最佳方法。
目前,我有一个无线电扫描仪的 icecast mp3 流,其中“正在播放”的元数据会根据扫描仪登陆的频道实时更新。当使用 VLC 等专用媒体播放器时,元数据与接收到的音频完美对齐,并且它的功能完全符合我的要求 - 本质上是一个远程无线电扫描仪。我想通过网页实现类似的东西,表面上这似乎是一个简单的任务。
如果我只想流式传输音频,那么使用简单的<audio>标签就足够了。然而,HTML5 音频播放器没有嵌入流内元数据的概念,icecast 与 mp3 音频数据一起编码。虽然我可以从 icecast 服务器状态 json 查询当前“正在播放”的元数据,但由于客户端和服务器端缓冲,以这种方式完成时,音频和元数据之间可能会有超过 20 秒的延迟。在某些情况下,当扫描仪每秒更改其“正在播放”的元数据时,这完全不适合我的应用程序。
有一个非常有趣的 Node.JS 解决方案,它是在考虑到这个确切目标的情况下开发的——无线电扫描仪应用程序中的实时元数据:icecast-metadata-js。这表明确实可以同时处理来自单个 icecast 流的音频和元数据。现场演示尤其令人印象深刻:https ://eshaz.github.io/icecast-metadata-js/
但是,我正在寻找一种无需安装 Node.JS 即可完全在客户端运行的解决方案,而且这似乎应该是相对微不足道的。
今天搜索了一天的大部分时间后,似乎在本网站和其他地方提出了几个类似的问题,但没有任何连贯的、布局合理的答案或建议。从我迄今为止收集到的信息来看,我相信我的解决方案是使用 Javascript 流功能(例如fetch)从 icecast 服务器中提取原始 mp3 和元数据,通过 Web Audio API 播放音频并处理元数据当他们到达时阻止。如下图所示:

我想知道是否有人有任何好的阅读和/或通过 Web Audio API 播放 mp3 流的示例。在大多数 JS 方面,我仍然是一个相对新手,但我了解了 API 的基本概念以及它如何处理音频数据。我正在努力实现a)实时处理来自mp3流的数据,以及b)检测流中嵌入的元数据块并相应地处理这些元数据块的正确方法。
抱歉,如果这是一个冗长的问题,但我想提供足够的背景故事来解释为什么我想以我的具体方式去做事情。
提前感谢您的建议和帮助!