我正在寻找一种分析网络收音机内容的方法。我想编写一个 ruby 客户端,它可以从流中获取当前曲目、下一曲目、乐队、bpm 和其他元信息(例如,广播中的广播)。有人知道怎么做这个吗?以及如何将该流录制到 mp3 或 aac 文件中?
也许有一个图书馆已经可以做到这一点,到目前为止我还没有。
问候
我正在寻找一种分析网络收音机内容的方法。我想编写一个 ruby 客户端,它可以从流中获取当前曲目、下一曲目、乐队、bpm 和其他元信息(例如,广播中的广播)。有人知道怎么做这个吗?以及如何将该流录制到 mp3 或 aac 文件中?
也许有一个图书馆已经可以做到这一点,到目前为止我还没有。
问候
我会回答你的两个问题。
您所寻求的并非完全可能。下一首曲目的信息不可用(请记住,并非所有电台都只是播放播放列表中的歌曲......许多都提供现场内容)。BPM 等高级元数据不可用。你得到的只是这样的:
Some Band - Some Song
的格式{artist} - {song title}
也不总是被遵循。
有了这些警告,您可以通过连接到流 URL 并使用以下请求标头请求元数据来从流中获取元数据:
Icy-MetaData: 1
这告诉服务器发送元数据,该元数据被交错到流中。每 8KB 左右(由服务器在响应标头中指定),您会发现一大块要解析的元数据。我在这里写了一个关于如何解析的详细答案: 使用 PHP 从音频流中提取音轨信息 之前的问题是特定于语言的,但您会发现我的答案可以很容易地用任何语言实现。
音频播放软件通常对错误非常有弹性。SHOUTcast 服务器建立在此主体之上,并且不了解通过它们的数据。它们只是从编码器接收数据,当客户端请求流时,它们开始在任意点发送该数据。
在保存流数据时,您可以利用这一点。可以简单地将流数据写入文件。大多数音频播放器都可以毫无问题地播放它们。我已经用 MP3 和 AAC 对此进行了测试。
如果您想要一个更一致的文件,您将不得不使用库或自己解析流以在适当的帧上拆分,然后处理代码中的位库问题。这是很多工作,通常不值得做,除非您发现您的文件存在真正的兼容性问题。