【发布时间】:2021-04-05 18:43:04
【问题描述】:
我一直在尝试找出实施我已有一段时间的想法的最佳方法。
目前,我有一个无线电扫描仪的 icecast mp3 流,其中“正在播放”的元数据会根据扫描仪登陆的频道实时更新。当使用 VLC 等专用媒体播放器时,元数据与接收到的音频完美对齐,并且它的功能完全符合我的要求 - 本质上是一个远程无线电扫描仪。我想通过网页实现类似的东西,表面上这似乎是一项简单的任务。
如果我只想流式传输音频,使用简单的<audio> 标签就足够了。但是,HTML5 音频播放器没有嵌入流内元数据的概念,该元数据与 mp3 音频数据一起进行了 icecast 编码。虽然我可以从 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) 检测流中嵌入的元数据块并相应地处理这些块。
抱歉,如果这是一个冗长的问题,但我想提供足够的背景故事来解释为什么我想以我的具体方式去做事情。
提前感谢您的建议和帮助!
【问题讨论】:
标签: javascript metadata web-audio-api icecast